我想要抑制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
来实现。
-Wpedantic
看起来比其他警告更神奇(但在clang中不是)。 - gnzlbg#define FOO(...) foo(__VA_ARGS__)
。 - M.M