我想为零参数抑制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
为了清楚起见,应该在整个程序中启用警告,除非在这个特定的代码片段中。这是关于细粒度控制。只需不将-pedantic
传递给编译器,就可以在GCC中为整个程序禁用警告。
答案 0 :(得分:4)
你应该可以使用
来抑制它 #pragma GCC system_header
但这适用于文件的其余部分,您不仅可以在包含的文件中使用它。所以没有提供完美的范围,可能需要对头文件进行一些重组/间接包含。
(但坦率地说,如果你不能修复头文件符合标准,你不妨考虑整个标题是system_header,它排除了它产生大多数警告。)
答案 1 :(得分:1)
你可以尝试使用它:
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wvariadic-macros"
#define FOO(A, ...) foo(A, ##__VA_ARGS__)
#pragma GCC diagnostic pop