一种处理方法是使用可控制的头文件-I
,以及无法控制的(来自系统或第三方库)头文件-isystem
。在启用警告时,实际区别在于来自-isystem
头文件的警告信息将被屏蔽。
来自gcc的-I选项文档:
将目录dir添加到要搜索头文件的目录列表的头部。可以用它来覆盖系统头文件,替换成您自己的版本,因为这些目录在系统头文件目录之前搜索。但是,不应将此选项用于添加包含供应商提供的系统头文件的目录(使用
-isystem
)。如果使用多个-I
选项,则按从左到右的顺序扫描这些目录;标准系统目录在后面。如果使用
-I
指定了标准系统包含目录或使用-isystem
指定的目录,则将忽略-I
选项。目录仍将被搜索,但作为系统目录位于系统包含链中的正常位置。这是为了确保GCC修复有错误的系统头文件和包含下一个指令的顺序的过程不会被意外更改。如果确实需要更改系统目录的搜索顺序,请使用-nostdinc
和/或-isystem
选项。
因此,除了特殊情况(如供应商提供的系统头文件)外,-I
可能是指定头文件位置的首选选项。
您应该使用-I来指定头文件的位置。
使用-isystem指定的文件将在处理完-I后进行搜索,并且会受到gcc(与标准系统头文件相同)的特殊处理。
我通过一些实验发现以下区别。想象一下以下设置:
my_std_lib/stdio.h
#ifndef _CUSTOM_STDIO_H
void test() {}
#endif
#include_next <stdio.h>
#include_next <custom.h>
my_user_lib/custom.h
#ifndef _CUSTOM_HEADER_H
void custom_func() {}
#endif
main.cpp
#include "stdio.h"
int main() {
test();
custom_func();
printf("Hello world!");
return 0;
}
g++ -isystem my_std_lib -isystem my_user_lib main.cpp
进行编译,一切都会正常工作。g++ -isystem my_std_lib -I my_user_lib main.cpp
会导致错误。In file included from main.cpp:1:
my_std_lib/stdio.h:10:15: fatal error: 'custom.h' file not found
#include_next <custom.h>
^~~~~~~~~~
1 error generated.
当您使用-I包含头文件"Myheader.h"时,编译器生成搜索顺序:"Myheader.h","system/headers"。因此,如果在"MyHeader.h"中找不到某些内容,则会回退到"system/headers"。但是,当您使用-isystem时,基本上是在告诉编译器用我提供的内容替换"system/headers"。因此,就没有了回退到"system/headers"的情况。