如何在g++中禁止特定的警告

37

我想从g++中屏蔽特定的警告。我知道-Wno-XXX这个选项,但我想要更加特定的。我希望保留-Weffc++中的一些警告,而不是全部。就像在lint中禁用特定消息一样。

在gcc中有内置的方法可以做到这一点吗?还是我需要编写一个包装脚本?


1
如果您想要禁用n行代码的警告,请参考此答案 - Keith Morgan
如果您愿意将其添加到源代码文件中,可以按照此处(以及可能在其他答案中)描述的步骤执行以下操作:https://codeyarns.com/2014/03/11/how-to-selectively-ignore-a-gcc-warning/ - Guy Avraham
5个回答

25
很遗憾,g++不提供此功能。在VC++中,您可以使用#pragma warning来禁用某些特定的警告。在gcc中,您可以使用diagnostic pragmas,它允许您为特定文件或项目启用/禁用某些类型的诊断信息。
编辑:自4.6.4起,GCC支持推送/弹出警告(请参见changelog)。

这不正确,你可以通过推入/弹出状态并在该推入/弹出区域内调整诊断信息来仅围绕一行代码使用诊断编译指示。 - Alexis Wilke
1
@AlexisWilke 的确,这是在我的回答几年后添加到 gcc 中的,让我更新一下! - Luc Touraille

13

对于某些警告,可以使用命令行开关来禁用它们。为了知道应该使用哪个开关,请在gcc命令后添加-fdiagnostics-show-option参数。


获取警告名称的命令行选项非常有用。 - Troy Daniels

3

你可以直接在输出结果上使用grep -v命令。

根据你想要禁用的警告,有时可以通过代码进行修正。例如:

int main()
{
  int i;
}

生成: foo.cc:4: 警告: 未使用的变量 'i'

而这个则不会产生警告:

#define MARKUSED(X)  ((void)(&(X)))

int main()
{
  int i;
  MARKUSED(i);
}

1
GCC还有一个关键字__extension__,它可以抑制下一条语句的警告。 - Gilad Naor
4
将代码部分用环绕符号括起来,例如 #pragma GCC diagnostic ignored "-Wfloat-equal"#pragma GCC diagnostic pop - Evgeni Sergeev
该操作正在寻求通用解决方案,而非仅限于此未使用变量警告。 - FaceBro

1
将标准错误输出到一个过滤器,以去除你不想看到的内容。例如,这是我的 makefile 文件:
main.o:  main.cpp
    g++ -c -Wall main.cpp 2>&1 | grep -v Wunused-variable

似乎更加复杂,因为警告可能适用于多行(例如,当它包含代码片段时)。 - AndreyS Scherbakov
如果你使用了-Werror,那么隐藏警告并没有什么用处(甚至可以说,它一点也帮不上你的忙)。 - Alexis Wilke

0

当我的同事试图阻止我编写简洁的代码时,他们使用g++命令行选项。

-Werror-parenthesis

我在我的代码中禁用了这个错误:

#pragma GCC diagnostic ignored "-Wparentheses"

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