如何从库标题中禁止显示 GCC 警告?

我有一个使用 log4cxx、 ost 等库的项目,这些库的头部会生成大量(重复的)警告。有没有一种方法可以禁止来自 library include (即 # include < some-header)的警告。H >)或包括来自某些路径的?我希望在项目代码中使用-Wall 和/或-Wtra,而不会模糊相关信息。我目前在 make 输出上使用 grep,但是我想要一些更好的东西。

59760 次浏览

您可以尝试使用 预编译头。警告不会消失,但至少不会显示在您的主编译。

#pragma是对编译器的指令。你可以在 # include 之前设置一些内容,之后禁用它。

你也可以在 命令行上做。

另一个特别关于 禁用警告的海湾合作委员会页面。

我倾向于在源代码中使用 # 杂注的选项,然后提供一个 声音 为什么要禁用警告的原因(作为注释)。

GCC 通过 分类的警告类型来处理这个问题。您可以将它们分类为警告或忽略。以前链接的文章将向您显示哪些警告可能被禁用。

注意: 您还可以通过使用 属性来修改源代码以防止某些警告; 但是,这将您与 GCC 绑定得非常紧密。

注2: GCC 还使用微软编译器中使用的 弹出/推送界面——微软通过此界面禁用警告。我建议你进一步调查,因为我不知道这是否可能。

这些警告肯定是有原因的。这些问题可能是由于使用库的代码中的错误造成的,也可能是由于库代码本身中的错误造成的。在第一种情况下,修复代码。在第二种情况下,要么停止使用库,要么如果它是 FOSS 代码,修复它。

我找到诀窍了。对于 library include,在 makefile 中使用 -isystem dir而不是 -Idir。海湾合作委员会然后视为系统包括和忽略来自他们的任何警告等。

您可以尝试使用 -isystem而不是 -I来包含库头。这将使它们成为“系统头”,海湾合作委员会不会为它们报告警告。

你可以使用杂注,例如:

// 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

对于那些使用 CMake 的用户,您可以修改 include_directories指令以包含符号 SYSTEM,该符号抑制针对此类头的警告。

include_directories(SYSTEM "${LIB_DIR}/Include")
^^^^^^

如果您需要显式地覆盖系统标头,那么您只能使用杂注。您可以通过 make depend输出验证正在使用的内容。

也请参阅 Gcc > = 4.6的诊断推送

把以下内容

#pragma GCC system_header

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

另一种方法是在 makefile 中告诉编译器忽略特定文件夹的警告:

$(BUILD_DIR)/libs/%.c.o: CFLAGS += -w