预定义宏
ANSI C 定义了许多宏。在编程中您可以使用这些宏,但是不能直接修改这些预定义的宏。简而言之,预定义宏就是C中已经定义的量,我们可以使用,但是不能直接修改。
宏 | 描述 |
---|---|
__DATE__ | 当前日期,一个以 "MMM DD YYYY" 格式表示的字符常量。 |
__TIME__ | 当前时间,一个以 "HH:MM:SS" 格式表示的字符常量。 |
__FILE__ | 这会包含当前文件名,一个字符串常量。 |
__LINE__ | 这会包含当前行号,一个十进制常量。 |
__STDC__ | 当编译器以 ANSI 标准编译时,则定义为 1。 |
我们可以看一下实例:
#include <stdio.h>
int main(void)
{
printf("File :%s\n", __FILE__ );
printf("Date :%s\n", __DATE__ );
printf("Time :%s\n", __TIME__ );
printf("Line :%d\n", __LINE__ );
printf("ANSI :%d\n", __STDC__ );
}
它会产生如下结果:
File :test.c
Date :Jun 2 2012
Time :03:36:24
Line :8
ANSI :1
预处理器运算符
这边我们涉及到4个运算符。
1.宏延续运算符(\)
一个宏通常写在一个单行上,如果太长,可以用该符号折行再写。例如:
#define message_for(a, b) \
printf(#a " and " #b ": We love you!\n")
2.字符串常量化运算符(#)
把宏中所给的参数转化为字符串常量。
#include <stdio.h>
#define message_for(a, b) \
printf(#a " and " #b ": We love you!\n")
int main(void)
{
message_for(Carole, Debra);
return 0;
}
会有结果:
Carole and Debra: We love you!
3.标记粘贴运算符(##)
##将会合并两个参数成为一个标记,例如n=34,那token##n将会是token34。请看下例:
#include <stdio.h>
#define tokenpaster(n) printf ("token" #n " = %d", token##n)
int main(void)
{
int token34 = 40;
tokenpaster(34);
return 0;
}
结果如下:
token34 = 40
4.defined() 运算符
预处理器 defined 运算符是用在常量表达式中的,用来确定一个标识符是否已经使用 #define 定义过。如果指定的标识符已定义,则值为真(非零)。如果指定的标识符未定义,则值为假(零)。下面的实例演示了 defined() 运算符的用法:
#include <stdio.h>
#if !defined (MESSAGE)
#define MESSAGE "You wish!"
#endif
int main(void)
{
printf("Here is the message: %s\n", MESSAGE);
return 0;
}
结果输出:
Here is the message: You wish!
参数化的宏
用CPP模拟函数,应该可以长生更高的效率。
#include <stdio.h>
#define MAX(x,y) ((x)>(y)?(x):(y))
#define SQUARE(x) ((x)*(x))
int main(void){
printf("Max between 20 and 10 is %d\n",MAX(20,10));
printf("The square of 5 is %d\n",SQUARE(5));
return 0;
}
网友评论