新しい -I- オプションは、デフォルトの検索規則に対する制御をさらに強化します。この節で説明しているように、コマンド行の最初の -I- だけが有効です。-I- オプションをコマンド行に配置すると、次のような効果があります。
#include "foo.h" 形式のインクルードファイルの場合、次の順序でディレクトリを検索します。
1. -I オプションで指定されたディレクトリ内 (-I- の前後)
2. コンパイラで提供される C++ ヘッダーファイル、ANSI C ヘッダーファイル、および特殊な目的のファイルのディレクトリ
3. /usr/include ディレクトリ内
#include <foo.h> 形式のインクルードファイルの場合、次の順序でディレクトリを検索します。
1.-I のあとに指定した -I- オプションで指定したディレクトリ内。
2. コンパイラで提供される C++ ヘッダーファイル、ANSI C ヘッダーファイル、および特殊な目的のファイルのディレクトリ。
3. /usr/include ディレクトリ内。
次の例は、prog.c のコンパイル時に -I- を使用した結果を示しています。
prog.c #include "a.h" #include <b.h> #include "c.h" c.h #ifndef _C_H_1 #define _C_H_1 int c1; #endif int/a.h #ifndef _A_H #define _A_H #include "c.h" int a; #endif int/b.h #ifndef _B_H #define _B_H #include <c.h> int b; #endif int/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.c の #include "c.h" 文を処理する際、プリプロセッサは、prog.c を含むディレクトリから c.h ファイルを取り込みます。-H オプションがインクルードファイルのパスを印刷するようにコンパイラに指示していることに注意してください。
example% cc -c -Iinc -H prog.c 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.c inc/a.h ./c.h inc/b.h inc/c.h ./c.h |
コンパイラがインストールされている位置の /usr/include、 /lib、/usr/lib を検索ディレクトリに指定しないでください。
詳細は、「B.2.37 -I[-|dir]」の節を参照してください。