对于debugbuilds,我通常使用Clang,因为它更好地格式化警告和错误,并使它更容易跟踪它们并修复它们。
但最近在添加了一个带有可变参数的宏之后,Clang告诉我以下内容(来自虚拟项目):
main.cpp:5:20: warning: named variadic macros are a GNU extension [-Wvariadic-macros]
#define stuff3(args...) stuff_i(args)
我知道macroname(args...)
在各种编译器中编译得很好,包括Visualstudio,Sunstudio,当然还有GCC。但是为了确保clang是正确的,我尝试了另外两种扩展可变参数的方法:
第1名:
#define stuff1(...) stuff_i(...)
2号:
#define stuff2(...) stuff_i(__VA_ARGS__)
我都收到此消息:
main.cpp:3:16: warning: variadic macros were introduced in C99 [-Wvariadic-macros]
...这让我想知道Variadic宏是否实际上是C ++标准的一部分(当然我知道预处理器是独立解释的)?
答案 0 :(得分:39)
引用Wikipedia:
变量参数宏于1999年在C语言标准的ISO / IEC 9899:1999(C99)修订版中引入,2011年在ISO / IEC 14882:2011(C ++ 11)C ++语言版本中引入标准。
所以它是C99和C ++ 11以后的标准,但是C ++ 03中的GNU扩展。
答案 1 :(得分:28)
从C ++ 11开始,可变参数宏现在包含在标准C ++中。 C ++ 11标准的第16.3节规定了可变参数宏,使它们与C99的可变参数宏兼容(问题的第二种形式)。
以下是C ++中符合标准的可变参数宏定义的示例:
#define foo(x, y, ...) bar(x, y, __VA_ARGS__)
答案 2 :(得分:4)
以示例“Number 2”的形式,它们在C99中是标准的,并且C ++编译器的预处理器通常与C和C ++编译相同。
他们也支持Microsoft VC ++,尽管它对C99合规性有其他顽固抵制。因此,在GCC和GCC之间没有什么理由可以避免使用它们。即使在我使用的大多数嵌入式系统编译器上,也支持它们。
然而,避免使用“1号”形式,这是GCC特有的,并且毫无疑问已被弃用。
答案 3 :(得分:0)
标准说明 16.3宏替换:
标识符_ _ VA_ARGS _ _只应出现在使用该函数的类函数宏的替换列表中 参数中的省略号表示法。