测试代码及解释:
#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
","one "));
SECONDPRINT(("test: %s
","two "));//括号内作为一个整体处理,然后输出都好运算符最后的数据two
SECONDPRINT("test: %s
","two ");
SECONDPRINT("three
");//可变参数可以被忽略
SECONDPRINT("four %s
",NULL);//可变参数可以为空
THIRDPRINT("third:%s
","hello");//可变参数不可以被忽略
THIRDPRINT("third:%s
",NULL);//可变参数可以为空
debug("debug:%s
","debug");//可变参数不可以被忽略
return 0;
}