我通常使用-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)))
答案 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>
收到警告。