我正在寻找一种使用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警告标志列表(最好是普通列表)?
-I
引入它们的包含路径,请改用-isystem
。问题解决了。 :) 然后,您可以重新打开警告(加上-Werror
!)以捕获您将来引入到代码中的错误。您的代码现在可能没有警告,但警告的整个目的是在您将来破坏它时捕获它... - Lightness Races in Orbit-w
(小写 w)可以禁用所有警告,但似乎不能作为#pragma GCC diagnostic
的参数接受,抱歉。 - zwol