可变参数宏是C语言与C++语言的函数宏的参数个数可以是0个或多个。这一语言特性由C99引入。C++11也开始支持。[1]
“可变参数宏”的各地常用名称 | |
---|---|
中国大陆 | 可变参数宏 |
台湾 | 可变参数巨集 |
声明语法
声明语法类似于可变参数函数:逗号后面三个句点"...",表示一个或多个参数。但常见编译器也允许传递0个参数。[2][3]宏扩展时使用特殊标识符__VA_ARGS__表示所传递的参数的替换。
没办法访问可变参数列表内的单个参数,也不能获知多少个参数被传递。[4]
实现支持
C/C++编译器支持:
- GNU Compiler Collection 3.0,[2]
- Clang ,[5]
- Visual Studio 2005,[3]
- C++Builder 2006,
- Oracle Solaris Studio (Sun Studio) Forte Developer 6 update 2 (C++ version 5.3).[6]
尾部逗号
对于可变参数为空情形,Visual Studio[3]直接去掉可变参数前面的逗号;GCC[2]需要在__VA_ARGS__前面放上##以去除逗号。
# define MYLOG(FormatLiteral, ...) fprintf (stderr, "%s(%d): " FormatLiteral "\n", __FILE__, __LINE__, __VA_ARGS__)
对于
MYLOG("Too many balloons %u", 42);
扩展为:
fprintf (stderr, "%s(%u): " "Too many balloons %u" "\n", __FILE__, __LINE__, 42);
它等价于:
fprintf (stderr, "%s(%u): Too many balloons %u\n", __FILE__, __LINE__, 42);
但对于例子:
MYLOG("Attention!");
扩展为
fprintf (stderr, "%s(%u): " "Attention!" "\n", __FILE__, __LINE__, );
GCC将会编译报错.
GCC支持下述不可移植的扩展:
# define MYLOG(FormatLiteral, ...) fprintf (stderr, "%s(%u): " FormatLiteral "\n", __FILE__, __LINE__, ##__VA_ARGS__)
这将删除空的__VA_ARGS__尾部逗号。
参见
参考文献
Wikiwand in your browser!
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.