可变参数宏

可变参数宏是C语言与C++语言的函数宏的参数个数可以是0个或多个。这一语言特性由C99引入。C++11也开始支持。

声明语法 
声明语法类似于可變參數函數：逗号后面三个句点"..."，表示一个或多个参数。但常见编译器也允许传递0个参数。宏扩展时使用特殊标识符__VA_ARGS__表示所传递的参数的替换。

没办法访问可变参数列表内的单个参数，也不能获知多少个参数被传递。

实现支持 

C/C++编译器支持：
GNU Compiler Collection 3.0, 
Clang , 
Visual Studio 2005, 
C++Builder 2006, 
Oracle Solaris Studio (Sun Studio) Forte Developer 6 update 2 (C++ version 5.3).

尾部逗号 
对于可变参数为空情形，Visual Studio直接去掉可变参数前面的逗号；GCC需要在__VA_ARGS__前面放上##以去除逗号。

# define MYLOG(FormatLiteral, ...)  fprintf (stderr, "%s(%d): " FormatLiteral "\n", , , __VA_ARGS__)

对于
MYLOG("Too many balloons %u", 42);
扩展为：
fprintf (stderr, "%s(%u): " "Too many balloons %u" "\n", , , 42);
它等价于：
fprintf (stderr, "%s(%u): Too many balloons %u\n", , , 42);

但对于例子：
MYLOG("Attention!");
扩展为
fprintf (stderr, "%s(%u): " "Attention!" "\n", , , );
GCC将会编译报错.

GCC支持下述不可移植的扩展:
# define MYLOG(FormatLiteral, ...)  fprintf (stderr, "%s(%u): " FormatLiteral "\n", , , ##__VA_ARGS__)
这将删除空的__VA_ARGS__尾部逗号。

參見 
可變參數函數

参考文献 

 

C语言
C++