C语言可变参数宏

552 阅读1分钟

上一篇文章分享了可变参数在函数中的使用方法,但是可变参数还是只能应用在真正的函数中,不能使用在宏中,所以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__的作用是,如果可变参数为空,预处理器就会除去它前面的那个括号,这样就真正的实现了宏的参数可变!