インクルードファイルの検索規則を次のとおり変更します。
#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 ディレクトリ
インクルードファイルの名前が標準ヘッダーの名前と一致する場合は、「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" 形式のインクルード文のカレントディレクトリ (インクルードしているファイルのディレクトリ) のデフォルトの検索動作を示します。#include "c.h" ステートメントを inc/a.h で処理するときは、コンパイラで inc サブディレクトリから c.h ヘッダーファイルがインクルードされます。#include "c.h" 文を prog.cc で処理するときは、コンパイラで 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 オプションで命名されたディレクトリを検索します。#include "c.h" 文を inc/a.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 を検索ディレクトリに指定しないでください。