如何抑制GCC对于特定宏定义在源文件中零参数的可变宏警告

11

我想要抑制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

需要明确的是,除了这段特定的代码片段外,整个程序都应启用警告。这涉及到细粒度控制。在GCC中禁用整个程序的警告可以通过不向编译器传递-pedantic来实现。


1
@Zulan,那个问题问的是哪个警告标志的名称可以启用或禁用此警告。而这个问题是问在源文件中的一个宏定义中如何使用该警告标志来禁用此警告(你的答案更符合这里)。 - gnzlbg
我建议您只需编辑原始问题以澄清您的意图。 - Zulan
我可以这样做,但这样对我来说基本上就没有太多意义了(感觉问题被改变得太多了)。对于想要关闭整个程序警告的人来说,只需要知道标志就足够了。这个问题有点...更多关于细粒度控制,因为在GCC中-Wpedantic看起来比其他警告更神奇(但在clang中不是)。 - gnzlbg
我同意你的观点,并将我的答案移动到这里。 - Zulan
一个替代方案是 #define FOO(...) foo(__VA_ARGS__) - M.M
2个回答

8
您可以使用#pragma GCC system_header来抑制这个警告,但它会应用于整个文件,您不能仅在包含的文件中使用它。因此,它并不提供完美的作用域,可能需要对头文件进行一些重组/间接包含。
(但老实说,如果您无法修复头文件以符合标准,您可以考虑将整个头文件视为system_header,这将排除它产生大多数警告。)
请参阅https://gcc.gnu.org/onlinedocs/cpp/System-Headers.html

1
你可以尝试使用这个:
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wvariadic-macros"
#define FOO(A, ...) foo(A, ##__VA_ARGS__)
#pragma GCC diagnostic pop

你有相关功能的资源链接吗? - Ray C
也许这个链接适合你:https://gcc.gnu.org/onlinedocs/gcc/Diagnostic-Pragmas.html - Michael S.
1
在GCC上不起作用,但在Clang上可以。 - Flamefire

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接