对于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++标准的一部分(当然我知道预处理器是独立解释的)?
使用以下命令
gcc -c -Wall -Wextra -pedantic -ansi -std=c99 -fstack-protector-all -fstack-check -O3 root.c -o rootTESTOBJECT
Run Code Online (Sandbox Code Playgroud)
我得到编译器警告root.h:76:22:警告:ISO C不允许命名的可变参数宏
72 #ifdef Debug
73 #include <stdio.h>
74 #define crumb(phrase0...) printf(phrase0)
75 #else
76 #define crumb(phrase0...)
77 #endif
Run Code Online (Sandbox Code Playgroud)
我相信选项-ansi -std = c99允许使用可变参数宏,无论如何它根据文档...
我已经尝试编辑76行了
76 #define crumb(phrase0...) printf("")
Run Code Online (Sandbox Code Playgroud)
看看这是否修复了警告,但没有任何乐趣.
编译器版本是Apple的gcc,版本4.2.1我不确定我是否需要过于担心,但我真的不喜欢警告.我错过了什么旗帜?