Variadic宏是非标准的吗?

32 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)
Run Code Online (Sandbox Code Playgroud)

我知道macroname(args...)在各种编译器中编译很好,包括Visualstudio,Sunstudio,当然还有GCC.但是为了确保clang是正确的,我尝试了另外两种扩展可变参数的方法:

1号:

#define stuff1(...)  stuff_i(...)
Run Code Online (Sandbox Code Playgroud)

2号:

#define stuff2(...)  stuff_i(__VA_ARGS__)
Run Code Online (Sandbox Code Playgroud)

我都收到这条消息:

main.cpp:3:16: warning: variadic macros were introduced in C99 [-Wvariadic-macros]
Run Code Online (Sandbox Code Playgroud)

...这让我想知道Variadic宏是否实际上是C++标准的一部分(当然我知道预处理器是独立解释的)?

Tho*_*mas 39

引用维基百科:

变量参数宏在1999年引入了C语言标准的ISO/IEC 9899:1999(C99)修订版,并于2011年引入了ISO/IEC 14882:2011(C++ 11)C++语言标准的修订版.

所以它是C99和C++ 11以后的标准,但是C++ 03中的GNU扩展.


Dan*_*ing 28

从C++ 11开始,可变参数宏现在包含在标准C++中.C++ 11标准的第16.3节规定了可变参数宏,使它们与C99的可变参数宏(问题中的第二种形式)兼容.

以下是C++中符合标准的可变参数宏定义的示例:

#define foo(x, y, ...)    bar(x, y, __VA_ARGS__)
Run Code Online (Sandbox Code Playgroud)

  • 它符合标准,但如果相信维基百科,它还会遭受逗号错误。 (2认同)