Variadic宏是非标准的吗?

时间:2011-01-24 20:12:42

标签: c++ c-preprocessor variadic-macros

对于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 ++标准的一部分(当然我知道预处理器是独立解释的)?

4 个答案:

答案 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 _ _只应出现在使用该函数的类函数宏的替换列表中   参数中的省略号表示法。