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

Selectively disable GCC warnings for only part of a translation unit

提问人:Jon-Eric 提问时间:6/8/2009 最后编辑:Peter MortensenJon-Eric 更新时间:11/14/2021 访问量:57693

问:

与此 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 编译器-警告编译 指示

评论

0赞 Spudd86 6/15/2010
如果标头安装到 /usr/include 或你有什么,gcc 默认不会为它们生成警告。
0赞 starball 9/23/2023
这回答了你的问题吗?如何禁用几行代码的 GCC 警告

答:

36赞 chaos 6/8/2009 #1

最接近的是 GCC 诊断编译指示,.它不是很接近你想要的,并查看链接了解详细信息和注意事项。#pragma GCC diagnostic [warning|error|ignored] "-Wwhatever"

评论

1赞 11/18/2009
您知道不添加此功能的理由是什么以及在哪里吗?(我找不到它。我发现警告 push-disable-pop 很有用。
1赞 chaos 11/18/2009
我真的不认为“不添加功能”到 gcc 往往有理由,因为没有人提交工作补丁。
14赞 Bob Murphy 1/22/2010
这并不是说没有人愿意在 gcc 中为这种细粒度的警告控制做这项工作,或者提交代码——我知道硅谷的一家大公司已经这样做了,而另一家公司很乐意花钱请人来做这件事,并将代码放到流中。相反,根据与一个(作为 gdb 维护者之一)插入这些东西的人的讨论,gcc 维护者有一个理念:“如果有警告,这是一个错误,你需要修复它。所以(imo)这是一个宗教争论,他们控制着代码,所以他们赢了。
0赞 Tom 1/24/2010
为了补充 Bob 的评论,GCC 开发人员有不喜欢该指令的历史,因此任何特定于 GCC 的东西都可能更有可能作为 .#pragma__attribute__((foo))
10赞 Spudd86 6/15/2010
新的 GCC (>=4.4) 具有,因此您可以进行不仅仅是诊断......gcc.gnu.org/onlinedocs/gcc/......#pragma GCC push_options
33赞 Tom 1/22/2010 #2

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

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

评论

1赞 Nestor 3/14/2012
很棒的提示。如果使用 LLVM,请在“Apple LLVM 编译器 - 语言”部分的“其他 C 标志”下添加 -isystem 标志。
0赞 Lorenzo B 3/7/2013
@Tom 感谢分享。我不明白在哪里使用您的解决方案。你能多说一点吗?
101赞 Matt Joiner 8/3/2010 #3

这在 GCC 中是可能的 4.6 版本,或者在 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 */

评论

8赞 Dave Johansen 12/8/2011
gcc 4.6 ( gcc.gnu.org/onlinedocs/gcc-4.6.0/gcc/Diagnostic-Pragmas.html 中添加了 push 和 pop 功能。
1赞 Dan 3/21/2014
如果你要弹出两次,你可能想推两次。
2赞 Matt Joiner 3/23/2014
@Dan:阅读手册,并发表评论。请注意示例的来源。
0赞 Trevor Boyd Smith 4/3/2018
仅供参考,对于 4.4.7 等旧版本,您仍然可以使用 但未实现/支持。#pragma GCC diagnostic [error|warning|ignored]pop
0赞 TheExcitedEngineer 11/11/2021
有没有办法通过这种方法禁用一段代码的所有警告?
1赞 Not a real meerkat 4/3/2018 #4

这是对 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