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

时间:2009-12-08 13:43:41

标签: gcc warnings suppress-warnings gcc-warning

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

10 个答案:

答案 0 :(得分:111)

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

答案 1 :(得分:87)

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

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

答案 2 :(得分:46)

您可以使用编译指示。例如:

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

答案 3 :(得分:22)

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

答案 4 :(得分:8)

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

您也可以在command line

执行此操作

另一个专门针对disabling warnings的GCC页面。

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

GCC通过classifying警告类型对此进行处理。您可以将它们分类为警告或被忽略。之前链接的文章将向您显示可能禁用的警告。

注意:您也可以使用attributes按摩源代码以防止出现某些警告;但是,这与GCC非常接近。

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

答案 5 :(得分:4)

您可以尝试使用precompiled headers。警告不会消失,但至少不会出现在主编辑中。

答案 6 :(得分:1)

如果您需要显式覆盖系统标题,那么您将被限制为pragma。您可以通过make depend输出验证您使用的内容。

另见diagnostic push-pop for gcc >= 4.6

答案 7 :(得分:0)

放入以下内容

#pragma GCC system_header

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

答案 8 :(得分:0)

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

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

答案 9 :(得分:-7)

这些警告必须有原因。这些要么是由使用库的代码中的错误引起的,要么是由库代码本身中的错误引起的。在第一种情况下,修复您的代码。在第二种情况下,要么停止使用库,要么是FOSS代码,修复它。