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