禁用系统标头的某些警告

时间:2016-04-01 11:30:31

标签: c gcc include gcc-warning

我通常使用-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)))

1 个答案:

答案 0 :(得分: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与此选项结合使用时,系统标头中的未知编译指示不会发出警告 - 为此,还必须使用-Wunknown-pragmas

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

-isystem /usr/X11/include

你不应该再从#include <X11/Xfuncproto.h>收到警告。