如何使用GCC的#pragma指令禁用所有警告

26

我正在寻找一种使用pragma指令来抑制GCC可能会出现的所有警告的方法。我创建了一些宏来帮助我消除第三方头文件中的警告,并且目前它们在msvc和clang上都能很好地工作。但是我仍然缺少正确的方法来使用GCC诊断pragma来抑制某个部分中的所有警告。以下是一些示例:

在msvc中,我们可以这样做:

#pragma warning(push, 0)
// Code that produces warnings...
#pragma warning(pop)

而在clang中,我们可以这样做:

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wall"
#pragma clang diagnostic ignored "-Wextra"
// Code that produces warnings...
#pragma clang diagnostic pop

现在中间的代码已经被永久地禁止警告。

Gcc 中也有类似于 clang 的 pragma 指令,我想我可以尝试像这样:

#pragma GCC diagnostic push
#pramga GCC diagnostic ignored "-Wall"
#pragma GCC diagnostic ignored "-Wextra"
// Code that produces warnings...
#pramga GCC diagnostic pop

然而在GCC中,通过使用诊断忽略编译指示传递-Wall和-Wextra并不像clang那样有效,也不能禁用所有可能的警告。相反,传递一个特定的禁用警告可以起到作用:

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-parameter"
void foo (int x) // No longer getting "unused parameter 'x'" warning
{
}
#pragma GCC diagnostic pop

所以目前我想到的唯一解决方法是创建一个包含所有GCC警告标志的长列表,并像上面那样使用它们。是否有更优雅的解决方案?如果没有,我在哪里可以获取完整的Gcc警告标志列表(最好是普通列表)?


38
因为我的代码没有警告,而且第三方头文件有时会包含警告。 - Fr0stBit
1
“System”头文件不应该泄漏其诊断信息,这正是为什么。如果您手动使用-I引入它们的包含路径,请改用-isystem。问题解决了。 :) 然后,您可以重新打开警告(加上-Werror!)以捕获您将来引入到代码中的错误。您的代码现在可能没有警告,但警告的整个目的是在您将来破坏它时捕获它... - Lightness Races in Orbit
1
有一个命令行选项 -w(小写 w)可以禁用所有警告,但似乎不能作为 #pragma GCC diagnostic 的参数接受,抱歉。 - zwol
1
我现在正面临完全相同的问题。由于这个问题已经几年了(当时答案似乎是“不可能的”),期间有什么变化吗? - luator
在Clang中,你可以禁用“-Weverything”,这甚至更好。 - HolyBlackCat
显示剩余2条评论
1个回答

2

文档中说:

目前只有警告(通常由“-W...”控制)可以被控制,而并非所有的警告。使用-fdiagnostics-show-option来确定哪些诊断信息是可控的,以及哪个选项控制它们。


我该如何使用这个标志?我能以某种方式将它传递给gcc以获取选项列表吗? - Fr0stBit
是的,您可以使用此选项构建文件,并将类似于[-Wunused-variable]的内容添加到每个警告中。 - Heavy
但这仍然不太有用,因为我的目的要么是找到一种通过一些巧妙的指令来抑制所有警告的方法,要么是收集所有受控警告的列表。 - Fr0stBit
@TheArtist:GCC文档有问题吗?它清晰而全面地列出了所有警告开关... - Lightness Races in Orbit
2
当我说所有受控警告时,我并不是指特定的翻译单元,而是GCC提供的所有受控警告。 - Fr0stBit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接