如何从库头中抑制GCC警告?

AdS*_*dSR 119 gcc warnings suppress-warnings gcc-warning

我有一个项目使用log4cxx,boost等库,其头文件生成大量(重复)警告.有没有办法抑制来自库包含的警告(即#include <some-header.h>)或包含某些路径?我希望像往常一样在项目代码中使用-Wall和/或-Wextra而不会隐藏相关信息.我目前在make输出上使用grep,但我想要更好的东西.

小智 121

您可以尝试使用-isystem而不是包含库头-I.这将使他们成为"系统标题",而GCC将不会为他们报告警告.

  • 如果您尝试在XCode中执行此操作,请在目标构建设置的"自定义编译器标志"中将系统路径粘贴到"其他C++标志"中. (11认同)
  • 一个潜在的缺点是,在某些平台上,g ++将自动将任何系统头文件包装在`extern"C"中,如果在`-isystem`路径中`#include`一个C++头,则会导致C链接的奇怪错误. (3认同)
  • 为什么这比OP自己的答案要多得多,而OP自己的答案在1.5小时之前说的完全一样? (2认同)

Dre*_*kes 98

对于那些使用CMake的用户,您可以修改include_directories指令以包含SYSTEM禁止针对此类标头发出警告的符号.

include_directories(SYSTEM "${LIB_DIR}/Include")
                    ^^^^^^
Run Code Online (Sandbox Code Playgroud)

  • 这似乎几乎解决了我的问题.我有1.)一个二进制目标,它依赖于2.)我自己编写的头文件目标,这取决于3.)一些外部库.我不知道如何只收到1和2的警告.你有什么想法吗? (2认同)
  • 似乎不起作用。我在一个使用 `easylogging++` 的项目中尝试了这个,并且我从 `easylogging++.h` 中得到了同样大量的警告,即使它所在的文件夹已经包含在 `SYSTEM` 选项中。 (2认同)

and*_*nes 50

你可以使用编译指示.例如:

// save diagnostic state
#pragma GCC diagnostic push 

// turn off the specific warning. Can also use "-Wall"
#pragma GCC diagnostic ignored "-Wunused-but-set-variable"

#include <boost/uuid/uuid.hpp>
#include <boost/uuid/uuid_generators.hpp>
#include <boost/uuid/uuid_io.hpp>
#include <boost/lexical_cast.hpp>

// turn the warnings back on
#pragma GCC diagnostic pop
Run Code Online (Sandbox Code Playgroud)

  • 仅适用于GCC> = 4.6 (3认同)
  • 看来你只能一一禁用警告,即“-Wall”不起作用。请参阅[相关问题](/sf/ask/2243450751/) (2认同)

AdS*_*dSR 26

我找到了诀窍.对于库包含,而不是在makefile 中-Idir使用-isystem dir.GCC然后处理提升等,因为系统包含并忽略来自它们的任何警告.


Has*_*yed 8

#pragma是编译器的指令.你可以在#include之前设置一些东西并在之后禁用它.

您也可以在命令行执行此操作.

另一个GCC页面专门用于禁用警告.

我会选择在源代码中使用#pragma,然后提供一个 合理的原因(作为注释),说明禁用警告的原因.这将意味着关于头文件的推理.

GCC通过警告类型进行分类来解决此问题.您可以将它们分类为警告或被忽略.之前链接的文章将向您显示可能禁用的警告.

注意:您还可以按摩源代码以通过使用属性来防止某些警告; 但是,这与GCC非常接近.

注2:GCC还使用microsoft编译器中使用的pop/push接口 --Microsoft通过此接口禁用警告.我建议你进一步调查,因为我不知道它是否可能.


Evg*_*nii 6

将以下内容

#pragma GCC system_header
Run Code Online (Sandbox Code Playgroud)

将关闭此文件中所有以下代码的 GCC 警告。