87

与此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.

我们在通常包含的标头中有代码,我们不想为其生成特定的警告。但是,我们希望包含这些标头的文件继续生成该警告(如果项目启用了该警告)。

4

4 回答 4

96

自 4.6 版或 2010 年 6 月左右在主干中,这在 GCC 中是可能的。

这是一个例子:

#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 */
于 2010-08-03T07:08:03.000 回答
36

最接近的是GCC 诊断 pragma#pragma GCC diagnostic [warning|error|ignored] "-Wwhatever". 它与您想要的不是很接近,请参阅链接以获取详细信息和警告。

于 2009-06-08T14:28:21.210 回答
33

我做过类似的事情。对于第三方代码,我根本不想看到任何警告。所以,我没有指定-I/path/to/libfoo/include,而是使用-isystem /path/to/libfoo/include. 这使得编译器出于警告的目的将这些头文件视为“系统头文件”,只要您不启用-Wsystem-headers,您基本上是安全的。我仍然看到一些警告从那里泄漏,但它减少了大部分垃圾。

请注意,这在您可以通过包含目录隔离有问题的代码时才对您有所帮助。如果它只是您自己项目的一个子集,或者与其他代码混合在一起,那么您就不走运了。

于 2010-01-22T01:19:18.787 回答
1

这是对Matt Joiner 答案的扩展。

如果您不想在整个代码中生成编译指示,可以使用_Pragma 运算符

#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
于 2018-04-02T16:32:20.530 回答