有选择地仅对部分翻译单元禁用 GCC 警告

问题描述 投票:0回答:4

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

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

c++ c gcc compiler-warnings pragma
4个回答
101
投票

在 GCC 中可以选择性地禁用警告,而从 4.6 版本起就可以使用推送/弹出功能。

这是文档中的示例:[*]

#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 */

[*] 最后的不平衡

pop
也被记录下来:

如果

pop
没有匹配的
push
,则会恢复命令行选项。


36
投票

最接近的是 GCC 诊断指令

#pragma GCC diagnostic [warning|error|ignored] "-Wwhatever"
。它与您想要的不太接近,请参阅链接了解详细信息和注意事项。


33
投票

我也做过类似的事情。对于第三方代码,我根本不想看到任何警告。因此,我没有指定

-I/path/to/libfoo/include
,而是使用
-isystem /path/to/libfoo/include
。这使得编译器将这些头文件视为“系统头文件”以用于警告目的,并且只要您不启用
-Wsystem-headers
,您就基本上是安全的。我仍然看到一些警告从那里泄漏出来,但它减少了大部分垃圾。

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


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
© www.soinside.com 2019 - 2024. All rights reserved.