上一篇文章分享了可变参数在函数中的使用方法,但是可变参数还是只能应用在真正的函数中,不能使用在宏中,所以C99编译器标准中引入了宏__VA_ARGS__,它允许我们定义可变参数宏,这样我们就可以使用拥有可以变化的参数表的宏;
具体形式如下:
#define debug(format, ...) printf(format, __VA_ARGS__)
缺省号...代表一个可以变化的参数表,使用保留名__VA_ARGS__把参数传递给宏,当宏的调用展开时,实际的参数就传递给 printf()了
比如:
debug("%s: %d\r\n", "debug", 100);
实际上会替换成:
printf("%s: %d\r\n", "debug", 100);
在使用可变参数宏的过程中,我们不仅可以传多个参数,也可以传入0个参数,比如
debug("debug");
然而当我们真的这样做的时候,编译器会报一个错误,原因是因为进行宏替换以后变成了如下的形式:
printf("debug",);
__VA_ARGS__ 会替换为与省略号匹配的所有参数,同时会将省略号前面的一个逗号带上,在如果不带任何参数的时候,既debug("debug"),会拓展成printf("debug",) 末尾多了个逗号,就会导致编译器会报错;
那如何解决这个问题呢?办法如下:
#define debug(format, ...) printf(format, ##__VA_ARGS__)
就是在__VA_ARGS__前面加上##,##__VA_ARGS__的作用是,如果可变参数为空,预处理器就会除去它前面的那个括号,这样就真正的实现了宏的参数可变!