1.基本概念
为了编译优化和方便,以及跨平台能力,宏被大量使用。C中的宏分为两类,对象宏(object-like macro)和函数宏(function-like marco)。对象宏可以理解为查找替换,而函数宏则是接收参数,对参数进行处理后返回相应的结果,和函数类似。宏只对宏定义后的代码起作用,且与定义在哪无关,即使函数不被调用,也可以使用宏。
2.宏替换的原则
-
在调用宏时,首先对参数进行检查,看看是否包含任何由#define定义的符号,如果是,它们首先被替换
-
替换文本随后被插入到程序中原来文本的位置,对于宏,参数名被他们的值替换
-
最后,再对结果文件进行扫描,看看它是否包含任何由#define定义的符号,如果是,就重复上述处理过程。
注意:
-
函数宏不能出现递归
-
宏定义的符号,即name部分不会在预处理替换的时候被搜索
-
宏定义#define后面不需要加“;”,某些情况下加了反而会报错
-
定义函数宏时,需要将参数和结果都以括号包裹起来,否则会出现因符号运算优先级带来的问题
-
使用函数宏时,不要以A++\A--的形式作为参数使用,否则会出现多次自增或自减导致的问题
3.宏中的“#”和“##”
#define RPINT(FORMAT, VALUE) printf("the v