【发布时间】:2016-06-05 20:33:27
【问题描述】:
我想抑制零参数的 GCC 可变参数宏参数警告,例如:
// for illustration purposes only:
int foo(int i) { return 0; };
#define FOO(A, ...) foo(A, ##__VA_ARGS__)
FOO(1);
^ warning: ISO C++11 requires at least one argument for the "..." in a variadic macro
使用 GCC 5.3.0 时源文件中的特定宏定义。
在 clang 中是这样完成的:
// ... large file
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wgnu-zero-variadic-macro-arguments"
#define FOO(A, ...) foo(A, ##__VA_ARGS__)
#pragma clang diagnostic pop
// ... large file
// not necessary on the same file
FOO(1); // doesnt trigger the warning
在 gcc 中,-pedantic 似乎是一种神奇的警告类型,因此以下内容不起作用:
// ... large file
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wpedantic"
#define FOO(A, ...) foo(A, ##__VA_ARGS__)
#pragma GCC diagnostic pop
// ... large file
为了清楚起见,警告应该在整个程序中启用,除了这个特定的 sn-p 代码。这是关于细粒度的控制。只需不将 -pedantic 传递给编译器,即可在 GCC 中为整个程序禁用警告。
【问题讨论】:
-
@Zulan 该问题要求提供启用禁用此警告的警告标志的名称。这个问题询问如何在源文件的宏定义中准确地使用该警告标志来禁用此警告(您的答案更适合这里)。
-
我建议只编辑原始问题以澄清您的意图。
-
我可以这样做,但基本上对我来说已经没有多大意义了(感觉像改变问题太多了)。对于有兴趣为整个程序打开警告的人来说,只知道标志就足够了。这个有点……更多关于细粒度控制,因为
-Wpedantic看起来比 GCC 中的其他警告更神奇(但不是 clang)。 -
我同意你的论点并将我的答案移到这里。
-
本案例的替代解决方案是
#define FOO(...) foo(__VA_ARGS__)