提问人:AdSR 提问时间:12/8/2009 更新时间:2/3/2021 访问量:65318
如何抑制库标头中的 GCC 警告?
How to suppress GCC warnings from library headers?
问:
我有一个使用 log4cxx、boost 等库的项目,其标头会生成大量(重复)警告。有没有办法禁止来自库包含(即 #include < some-header.h>)或来自某些路径的包含的警告?我想像往常一样在项目代码上使用 -Wall 和/或 -Wextra,而不会掩盖相关信息。我目前在make输出上使用grep,但我想要更好的东西。
答:
您可以尝试使用预编译的标头。警告不会消失,但至少不会出现在您的主编译中。
评论
-isystem
#pragma
是编译器的指令。您可以在 #include 之前设置某些内容,然后在之后禁用它。
您也可以在命令行中执行此操作。
另一个专门关于禁用警告的 GCC 页面。
我会选择在源代码中使用 #pragma,然后提供一个合理的理由(作为评论)来说明您为什么要禁用警告。这意味着对头文件进行推理。
GCC 通过对警告类型进行分类来实现此目的。您可以将它们分类为警告或忽略。之前链接的文章将向您显示哪些警告可能被禁用。
注意:您还可以使用属性来修改源代码以防止某些警告;但是,这使您与 GCC 紧密相连。
注意2:GCC还使用Microsoft编译器中使用的pop/push接口 - Microsoft通过此接口禁用警告。我建议你进一步调查这个问题,因为我不知道这是否可能。
评论
这些警告一定是有原因的。这些错误可能是由使用库的代码中的错误引起的,也可能是由库代码本身的错误引起的。在第一种情况下,修复代码。在第二种情况下,要么停止使用该库,要么如果它是 FOSS 代码,请修复它。
评论
我找到了诀窍。对于库包含,而不是在 makefile 中使用。然后,GCC 将 boost 等视为系统包含并忽略来自它们的任何警告。-Idir
-isystem dir
评论
您可以尝试使用 而不是 来包含库头文件。这将使它们成为“系统标头”,GCC 不会报告它们的警告。-isystem
-I
评论
extern "C"
#include
-isystem
您可以使用编译指示。例如:
// 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
评论
gcc
cl
gcc
对于使用 CMake 的用户,您可以修改指令以包含禁止针对此类标头的警告的符号。include_directories
SYSTEM
include_directories(SYSTEM "${LIB_DIR}/Include")
^^^^^^
评论
easylogging++
easylogging++.h
SYSTEM
如果需要显式重写系统标头,则只能使用编译指示。您可以通过输出验证您正在使用的包含。make depend
把以下内容
#pragma GCC system_header
将关闭此文件中所有以下代码的 GCC 警告。
另一种方法是,在 makefile 中,告诉编译器忽略特定文件夹的警告:
$(BUILD_DIR)/libs/%.c.o: CFLAGS += -w
评论