【问题标题】:Disable certain warnings for system headers禁用系统标头的某些警告
【发布时间】:2016-07-21 04:41:31
【问题描述】:

我通常使用-Werror 编译我的项目并打开一些警告(如-Wsequence-point -Wcast-align -Wstrict-prototypes -Wstrict-aliasing)。

使用这些设置,在某些平台上,某些标头在包含时会产生警告(由于第一次切换而导致错误)。例如,我在 MacOS 上看到了一些 X11 标头。

我不想降低我的代码的质量标准。有没有办法让我的项目在不全局禁用有问题的警告的情况下编译?例如,有没有办法仅对项目中包含的标头禁用警告?

编辑

这是我试图解决的问题的一个示例:

gcc -std=c99 -pthread -O2 -fstrict-aliasing -I/usr/X11/include -Werror -Wpedantic -Wstrict-aliasing -Wchar-subscripts -Wimplicit -Wsequence-point -Wwrite-strings -Wunused-variable -Wvla -c -o main.o main.c
/usr/X11/include/X11/Xfuncproto.h:145:24: error: named variadic macros are a GNU extension [-Werror,-Wvariadic-macros]
#define _X_NONNULL(args...)  __attribute__((nonnull(args)))

【问题讨论】:

  • 看看HERE
  • -Wno-system-headers不是默认的吗?
  • @LPs:自从 HTML 发明以来,“这里”-链接已被弃用。 “GCC 的诊断编译指示”将是一个很好的链接文本。 ;-)
  • @DevSolar 知道了! ;)
  • stackoverflow.com/q/1867065/1918193 。您如何在系统上获取 X11 标头(默认情况下可用,-I/some/path,某些框架?),您能显示命令行吗?

标签: c gcc include gcc-warning


【解决方案1】:

Options for Directory Search 上的 GCC 手册列表:

这些选项指定用于搜索头文件、库和编译器部分的目录:

-I dir
-iquote dir
-isystem dir
-idirafter dir

将目录dir添加到预处理过程中要搜索头文件的目录列表中。如果dir 以‘=’开头,则‘=’被替换为sysroot 前缀;见--sysroot-isysroot

-iquote 指定的目录仅适用于指令的引用形式#include "file"。用-I-isystem-idirafter 指定的目录适用于查找#include "file"#include <file> 指令。

您可以在命令行中指定任意数量的这些选项或这些选项的组合,以在多个目录中搜索头文件。查找顺序如下:

  • 对于include指令的引用形式,首先搜索当前文件的目录。
  • 对于 include 指令的引用形式,-iquote 选项指定的目录按从左到右的顺序搜索,因为它们出现在命令行上。
  • 使用-I 选项指定的目录按从左到右的顺序扫描。
  • 使用-isystem 选项指定的目录按从左到右的顺序扫描。
  • 扫描标准系统目录。
  • 使用-idirafter 选项指定的目录按从左到右的顺序扫描。

您可以使用-I 覆盖系统头文件,替换为您自己的版本,因为在标准系统头文件目录之前搜索这些目录。但是,您不应使用此选项来添加包含供应商提供的系统头文件的目录;为此使用-isystem

-isystem-idirafter 选项还将目录标记为系统目录,以便它获得与标准系统目录相同的特殊处理。

如果标准系统包含目录,或用-isystem 指定的目录,也用-I 指定,则-I 选项将被忽略。该目录仍然被搜索,但作为系统目录在系统包含链中的正常位置。这是为了确保 GCC 修复有缺陷的系统标头的过程和 #include_next 指令的顺序不会被无意更改。如果您确实需要更改系统目录的搜索顺序,请使用-nostdinc 和/或-isystem 选项。

引用的倒数第二段指出,使用-isystem 指定目录会抑制警告,因为它们会被任何其他系统标头抑制(默认情况下)。

手册的Options to Request or Suppress Warnings 部分包括:

-Wsystem-headers

打印系统头文件中结构的警告消息。来自系统头文件的警告通常被抑制,假设它们通常不表示真正的问题,只会使编译器输出更难阅读。使用这个命令行选项告诉 GCC 从系统标头发出警告,就好像它们发生在用户代码中一样。但是,请注意,将 -Wall 与此选项结合使用不会警告系统标头中存在未知 pragma - 为此,还必须使用 -Wunknown-pragmas

因此,通过将包含/usr/X11/include/X11/Xfuncproto.h 文件的目录指定为系统目录:

-isystem /usr/X11/include

您不应再收到来自#include <X11/Xfuncproto.h> 的警告。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-12
    • 2020-07-31
    • 2017-10-09
    • 2020-12-29
    • 1970-01-01
    • 2022-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多