Oracle Solaris Studio 12.2:C++ 用户指南

A.2.36.1 示例

以下示例显示了编译 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 指定为搜索目录。