提问人:Jon-Eric 提问时间:6/8/2009 最后编辑:Peter MortensenJon-Eric 更新时间:11/14/2021 访问量:57693
有选择地仅对翻译单元的一部分禁用 GCC 警告
Selectively disable GCC warnings for only part of a translation unit
问:
与此 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.
我们在通常包含的标头中提供了代码,我们不希望为其生成特定的警告。但是,我们希望包含这些标头的文件继续生成该警告(如果项目启用了该警告)。
答:
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
评论