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

测试代码及解释:

#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;
}

详见参考

原文地址:https://www.cnblogs.com/starrytales/p/5809555.html