使用GCC的#pragma GCC diagnostic warning指令

4
我使用GCC 4.5.1版本,出现以下警告信息:
警告:在“#pragma GCC diagnostic”之后预期为[error|warning|ignored]
原因是“#pragma GCC diagnostic push”,该指令在GCC 4.6版本之前不存在。
我无法更改代码(不是我的代码),也不能更改GCC版本。有哪些GCC标志可以禁用这些警告?
附注:我看到了Why "pragma GCC diagnostic push" pop warning in GCC/C++?,但没有回答我的问题。

1
我发现这个Disabling-pragma-warnings解决了类似的问题。 - BobLoblaw
2个回答

9

GCC有两个标志可控制与#pragma相关的警告:

-Wunknown-pragmas
当遇到GCC不理解的“#pragma”指令时发出警告。如果使用此命令行选项,甚至会对系统头文件中的未知pragma发出警告。如果只通过-Wall命令行选项启用警告,则不会发生这种情况。

-Wno-pragmas
不要对pragma的误用(例如不正确的参数、无效的语法或pragma之间的冲突)发出警告。另请参见-Wunknown-pragmas

您可以使用-Wno-unknown-pragmas关闭它们的警告。


2
FYI:-Wno-unknown-pragmas 没有帮助。但是 -Wno-pragmas 有用。 - klm123
关于-Wno-unknown-warning的一些背景:如果使用了-Wno-形式,行为稍有不同:除非正在产生其他诊断信息,否则不会为-Wno-unknown-warning产生诊断信息。但是,-Wno-unknown-pragmas是否真正存在呢?它必须明确列在-Wunknown-pragmas的同一页上吗?它是否与GCC版本有关? - Peter Mortensen

0

这似乎是您的选择:

  1. 使用 -Wno-pragmas 来抑制所有不正确的#pragma使用警告。我认为不可能仅忽略您感兴趣的#pragma。
  2. 忽略警告输出。编译器已经警告你了,所以它完成了它的工作。您知道警告发生的原因以及基础案例是否无害。
  3. 使用sed查找/替换,只删除自己拷贝中的有问题的#pragma。您可以将其融合到构建脚本中,并在运行时生成源文件的拷贝。您可能可以使用sed注释掉有问题的#pragma并使用反向转换取消注释(例如,在提交到共享知识库之前)。
  4. 在本地位置编译GCC 4.6并使用它。

3.8 Options to Request or Suppress Warnings 包含相关的警告信息。


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