2016-02-23 77 views
7

我想压制GCC可变参数宏参数警告零个参数,例如通过生产中:如何抑制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时,源文件中的特定宏定义。

在铛,这是为完成如下:

// ... 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

[零个可变参数宏参数GCC编译器警告标志(的可能的复制http://stackoverflow.com/questions/35586426/gcc-compiler -warning-flag-for-zero-variadic-macro-arguments) – Zulan

+1

@Zulan该问题询问可以禁用此警告的警告标志的名称。该问题询问如何使用该警告标志在源文件的宏定义中禁用此警告(您的答案在这里更合适)。 – gnzlbg

+0

我建议只编辑原始问题以阐明你的意图。 – Zulan

回答

2

你应该能够抑制这种使用

#pragma GCC system_header

但是,适用于文件的其余部分,并包含文件,你不仅可以使用它。所以没有提供完善的范围,可能需要重新洗牌/间接包含头文件。

(但坦率地说,如果你不能修复头文件是符合标准的,您不妨考虑整个头一个system_header,其中不包括从生产最警告。)

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

0

你可以尝试使用这个:

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

您是否有链接到与此功能相关的任何资源? – jake

+0

也许这一个:https://gcc.gnu.org/onlinedocs/gcc/Diagnostic-Pragmas.html –