36- 宏替换不会发生在字符串中间。例如
#define YES yesman
printf("YES");
最后的运行结果是
YES
37- #undef的一个用法:用于确认一系列操作被定义为一个函数而不是一个宏。当你不确定某个后面带有括号的名字(例如getchar()),到底是一个宏定义还是一个函数定义的时候,可以在程序中加上
#undef getchar
这样如果getchar被定义为一个宏,编译的时候就会出错。
38- 如果一个宏的名字前面加了'#'符号,扩展出来的字符串两端会被自动加上双引号。例如:
#define dprint(expr) printf(#expr " = %g\n", expr)
如果在程序里出现了
dprint(x/y)
会被展开为
printf("x/y" " = %g\n", x/y);
并且在这种替换中,原来的宏参数中如果有\和",替换时前面会自动加上一个\形成一个escaped character,从而保证替换结果仍然是正确的。
39- 预处理操作符##提供的功能:用于连接宏参数。如果一个宏参数在对应的展开文字中和##相邻,那么,这个宏参数首先被用实际参数替代,然后##以及紧邻的空格被删除,之后结果被当作输入文件重新分析。例如
#define paste(front, back) front ## back
paste(counter, 2) = 0;
会被展开为
counter2 = 0;
40- 预处理操作符#if后面可以是任何常整数表达式,但是其中不允许出现:
sizeof
强制类型转换
enum类型的常量
阅读(785) | 评论(0) | 转发(0) |