C语言细节之九:宏与C预处理器
1、多语句宏的书写
通常的目标是:书写一个像包含一个单独的函数调用语句的宏。
这意味着:调用者需要提供最终的分号,而宏体则不需要。
因此宏体不能为简单的括弧包围的复合语句,因为如果这样,调用的时候就会发生语法错(明显是一个单独语句,但却多了一个分号)。每行的最后用\连接
2、sizeof不能用于#if预编译器指令中,因为此时还未对类型名称作解析
3、m4工具是用于多用途的预处理器
4、参数个数可变的宏的书写
一般用一个单独的用括弧括起来的”参数“定义和调用宏,参数在宏扩展的时候成为类似printf()那样的函数的整个参数列表。
#define DEBUG(args) (printf(“DEBUG: ”), printf arg)
if(n != 0) DEBUG((“n is %d\n”, n));
明显缺陷是必须记住使用一对额外的括弧。