将头文件的搜索规则更改为:
对于形式为 #include "foo.h" 的 include 文件,按以下顺序搜索目录。
对于形式为 #include "foo.h" 的 include 文件,按以下顺序搜索目录:
1. 使用 -I 选项指定的目录(在 -I- 前后)。
2. 编译器提供的 C++ 头文件、ANSI C 头文件和专用文件的目录。
3. /usr/include 目录。
对于 #include <foo.h> 形式的 include 文件,按以下顺序搜索目录:
1. 使用 -I 选项指定的目录(在 -I- 后面)。
2. 编译器提供的 C++ 头文件、ANSI C 头文件和专用文件的目录。
3. /usr/include 目录。
如果包括文件的名称与标准头的名称相匹配,另请参阅12.7.5 标准头文件实现。
以下示例显示了编译 prog.cc 时使用 -I- 的结果。
prog.cc #include "a.h" #include <b.h> #include "c.h" c.h #ifndef _C_H_1 #define _C_H_1 int c1; #endif inc/a.h #ifndef _A_H #define _A_H #include "c.h" int a; #endif inc/b.h #ifndef _B_H #define _B_H #include <c.h> int b; #endif inc/c.h #ifndef _C_H_2 #define _C_H_2 int c2; #endif |
以下命令显示了针对形式为 #include "foo.h" 的包含语句搜索当前目录(包含文件的目录)的缺省行为。在 inc/a.h 中处理 #include "c.h" 语句时,编译器将 inc 子目录中的 c.h 头文件包含进来。在 prog.cc 中处理 #include "c.h" 语句时,编译器将包含 prog.cc 的目录中的 c.h 文件包含进来。请注意,-H 选项表示指示编译器打印所包含文件的路径。
example% CC -c -Iinc -H prog.cc inc/a.h inc/c.h inc/b.h inc/c.h c.h |
以下命令显示了 -I- 选项的效果。编译器处理形式为 #include "foo.h" 的语句时,并不先在包含目录中查找,而是按照通过 -I 选项指定的目录在命令行上的显示顺序搜索这些目录。在 inc/a.h 中处理 #include "c.h" 语句时,编译器将 ./c.h 头文件而不是 inc/c.h 头文件包含进来。
example% CC -c -I. -I- -Iinc -H prog.cc inc/a.h ./c.h inc/b.h inc/c.h ./c.h |
命令行上有 -I- 时,编译器从不搜索当前目录,除非在 -I 指令中显式列出了该目录。甚至是形式为 #include "foo.h" 的包含语句,也是这种情况。
只有命令行上的第一个 -I- 会导致出现所述行为。
任何时候都不要将编译器安装区域 /usr/include、/lib 或 /usr/lib 指定为搜索目录。