与此MSVC预处理器代码最接近的GCC是什么?
#pragma warning( push ) // Save the current warning state.
#pragma warning( disable : 4723 ) // C4723: potential divide by 0
// Code which would generate warning 4723.
#pragma warning( pop ) // Restore warnings to previous state.
我们在常用的标题中包含代码,我们不希望生成特定的警告。但是,我们希望包含这些标头的文件继续生成该警告(如果项目启用了该警告)。
答案 0 :(得分:91)
从版本4.6开始,这是possible in GCC,或者在2010年6月左右在主干中。
以下是一个例子:
#pragma GCC diagnostic push
#pragma GCC diagnostic error "-Wuninitialized"
foo(a); /* error is given for this one */
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wuninitialized"
foo(b); /* no diagnostic for this one */
#pragma GCC diagnostic pop
foo(c); /* error is given for this one */
#pragma GCC diagnostic pop
foo(d); /* depends on command line options */
答案 1 :(得分:34)
最接近的是GCC diagnostic pragma,#pragma GCC diagnostic [warning|error|ignored] "-Wwhatever"
。它并不是非常接近您想要的,请参阅链接了解详情和警告。
答案 2 :(得分:32)
我做过类似的事情。对于第三方代码,我根本不想看到任何警告。因此,我使用-I/path/to/libfoo/include
而不是指定-isystem /path/to/libfoo/include
。这使得编译器将这些头文件视为“系统头”以用于警告,并且只要您不启用-Wsystem-headers
,您就大多数都是安全的。我仍然看到一些警告漏出,但它减少了大部分垃圾。
请注意,如果您可以通过include-directory隔离违规代码,则此仅可以帮助您。如果它只是你自己项目的一个子集,或者与其他代码混合在一起,那你就不走运了。
答案 3 :(得分:1)
这是对Matt Joiner's answer的扩展。
如果您不想在代码中生成编译指示,可以使用_Pragma operator:
#ifdef __GNUC__
# define DIAGNOSTIC_ERROR(w) _Pragma("GCC diagnostic error \"" w "\"")
# define DIAGNOSTIC_IGNORE(w) _Pragma("GCC diagnostic ignore \"" w "\"")
# define DIAGNOSTIC_PUSH _Pragma("GCC diagnostic push")
# define DIAGNOSTIC_POP _Pragma("GCC diagnostic pop")
#endif
// (...)
DIAGNOSTIC_ERROR("-Wuninitialized")
foo(a); // Error
DIAGNOSTIC_PUSH
DIAGNOSTIC_IGNORE("-Wuninitialized")
foo(a); // No error
DIAGNOSTIC_POP
foo(a); // Error