在debug版本中,我通常使用Clang编译器,因为它能更好地格式化警告和错误,并且使其更容易跟踪和修复。
但最近,当我添加了一个带有可变参数的宏时,Clang 给我返回了以下信息(来自一个虚拟项目):
main.cpp:5:20: warning: named variadic macros are a GNU extension [-Wvariadic-macros]
#define stuff3(args...) stuff_i(args)
我知道在很多编译器中,包括Visualstudio、Sunstudio和GCC, macroname(args...)
是可以编译通过的。但为了确保clang也能正常运行,我尝试了另外两种可变参数扩展的方式:
方法一:
#define stuff1(...) stuff_i(...)
第二点:
#define stuff2(...) stuff_i(__VA_ARGS__)
在两者上我都收到这个消息:
main.cpp:3:16: warning: variadic macros were introduced in C99 [-Wvariadic-macros]
这让我想知道变参宏实际上是否是C++标准的一部分(当然,我知道预处理器是独立解释的)?
-pedantic
选项,它应该报告所使用的扩展功能,例如变长数组或可变参数宏。在GCC中,它们被包含在内,因为它们是C99的一部分,逻辑已经实现,所以让C++开发者受益似乎是个好主意 :) - Matthieu M.