C语言可变参数宏及‘##’在可变参数中的作用

时间:2023-03-08 20:01:28

测试代码及解释:

#include <stdio.h>
#define PRINT(x) printf x #define SECONDPRINT(fmt,arg...) printf(fmt,##arg)
//如果可变参数被忽略或为空,'##'操作将使预处理器(preprocessor)去除掉它前面的那个逗号 #define THIRDPRINT(fmt,arg...) printf(fmt,arg)
//上述定义方式在标准C里,你不能省略可变参数,否则是非法的,但是你却可以给它传递一个空(NULL)的参数 #define debug(format, ...) printf (format, __VA_ARGS__)
//保留名 __VA_ARGS__ 把参数传递给宏,解释同上 int main(void){ PRINT(("test: %s\n","one "));
SECONDPRINT(("test: %s\n","two "));//括号内作为一个整体处理,然后输出都好运算符最后的数据two
SECONDPRINT("test: %s\n","two "); SECONDPRINT("three\n");//可变参数可以被忽略
SECONDPRINT("four %s\n",NULL);//可变参数可以为空 THIRDPRINT("third:%s\n","hello");//可变参数不可以被忽略
THIRDPRINT("third:%s\n",NULL);//可变参数可以为空 debug("debug:%s\n","debug");//可变参数不可以被忽略
return 0;
}

详见参考