? ? ? ? #define的形式,其实应该以#+define来理解,#的符号含义时替换,而define的意义是定义,其实按照语言的语法来理解很清晰,定义一个东西用来替换另一个东西。
? ? ? ? 双引号的作用有一点和#的意思相反的意思,再printf函数中如果使用了“”则再“”中的字符串会被视为普通文本,而不是一个可被替换的符号。例如:
#define TEST01(x) printf("Hello x is %d.\n",((x)*(x));
TEST(2);
输出为:Hello x is 4.
C语言允许在字符串中包含宏参数,而在类函数宏中,#作为一个预处理运算符,可以将记号转变为字符串。
#define TEST02(x) printf("Hello #x is %d.\n",((x)*(x));
TEST02(2);
TEST02(2+4);
输出结果:
Hello 2 is 4;
Hello 2+4 is 36;
?在这里,#号就是将2+4文本替换到了x的位置,预处理器不会进行运算,所以它不会输出为6 is 36.
? ? ? ? 预处理粘合剂:##运算符,这个符号会将宏替换体中的两个记号粘合在一起,例如:
#define TEST03(n) x##n;
#define PRINT_TEST03 printf("x"#n"= %d\n",x##n);
int main()
{
int TEST03(1) = 14; //int x1 = 14
PRINT)TEST03(1); //prinft("x1 = %d\n",x1)
}
输出结果为:x1 =14
· 实现宏定义的可变参数 头文件:stdvar.h
顾名思义,函数接受数量可变的参数。
其格式为:
#define TEST04(...) printf(__VA__ARGS__)
?将红参数列表中最后的参数写成省略号(...),并将__VA__ARGS__可用在替换部分中,表明省略号代表的东西。
#define TEST04(...) printf(__VA__ARGS__)
TEST04(“Howdy”);
TEST04(“weight = %d,shipping = $%.2f\n”,wt,sp);
即展开后的代码:
printf("Howdy");
printf(“weight = %d,shipping = $%.2f\n”,wt,sp);
在使用宏时需要注意的事项:
1.宏名中不可以出现空格,但在替换字符串中可以有空格。
2.用圆括号把宏的参数和整个替换体括起来,这样能确保被括起来的部分在下面这样的表达式中可以正确的展开:
forks = 2 * MAX(guests + 3,last);
2.用大写字母表示宏函数的名称。该惯例不如用大写字母白哦是宏常量应用广泛。但是大写字母可以提醒程序员注意,宏可能产生的副作用。
3.如果打算使用宏来加快程序的运行速度,那么首先要确定使用宏和使用函数书否会倒是较大差异。在程序中值使用一次的宏无法明显减少程序的运行时间,在桥套循环中使用宏更有助于提高效率。
|