如何在源文件

时间:2016-02-23 20:06:33

标签: c++ gcc macros

我想为零参数抑制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中为整个程序禁用警告。

2 个答案:

答案 0 :(得分:4)

你应该可以使用

来抑制它

#pragma GCC system_header

但这适用于文件的其余部分,您不仅可以在包含的文件中使用它。所以没有提供完美的范围,可能需要对头文件进行一些重组/间接包含。

(但坦率地说,如果你不能修复头文件符合标准,你不妨考虑整个标题是system_header,它排除了它产生大多数警告。)

请参阅https://gcc.gnu.org/onlinedocs/cpp/System-Headers.html

答案 1 :(得分:1)

你可以尝试使用它:

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wvariadic-macros"
#define FOO(A, ...) foo(A, ##__VA_ARGS__)
#pragma GCC diagnostic pop