Oracle Solaris Studio 12.2: C ユーザーガイド

2.16 インクルードファイルを指定する方法

インクルードC コンパイラシステムに付属している標準的なヘッダーファイルのいずれかをインクルードするには、次の形式を使用します。


#include <stdio.h>

山括弧 (<>) を使用すると、プリプロセッサがが、システム内にあるヘッダーファイル用の標準的な場所でヘッダーファイルを検索するようになります。通常は /usr/include ディレクトリです。

ユーザーが自分のディレクトリに格納したヘッダーファイルの場合は、次のように書式が異なります。


#include "header.h"

書式 #include "foo.h" (二重引用符を使用) の文に対し、コンパイラは、次の順番でインクルードファイルを検索します。

  1. 現在のディレクトリ (つまり、「インクルード」するファイルを含むディレクトリ)

  2. -I オプションで命名されたディレクトリ

  3. /usr/include ディレクトリ

ヘッダーファイルがインクルードされたソースファイルと同じディレクトリにない場合は、cc コマンドで -I オプションを使用して、ヘッダーファイルが格納されているディレクトリのパスを指定してください。たとえば次のように、ソースファイル mycode.c の中で stdio.hheader.h をインクルードしたとします。


#include <stdio.h>
#include "header.h"

この header.h../defs ディレクトリに格納されている場合は、次のコマンドを実行します。次のようなコマンド行があるとします。


% cc– I../defs mycode.c

この場合、プリプロセッサが header.h を検索する順序は、最初が mycode.c を含むディレクトリ、次が ../defs ディレクトリ、最後が標準の場所となります。stdio.h については最初が ../defs、次が標準の場所となります。相違点は、現ディレクトリを検索するのは名前を二重引用符で囲んだヘッダーファイルを検索する場合だけであることです。

-I オプションは 1 つの cc コマンド行の中で複数回指定することができます。指定したディレクトリをプリプロセッサが検索する順序は、コマンド行での指定順序と同じです。cc の複数のオプションを、同じコマンド行で指定できます。


% cc– o prog– I../defs mycode.c

2.16.1 -I- オプションによる検索アルゴリズムの変更

新しい -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

2.16.1.1 警告

コンパイラがインストールされている位置の /usr/include /lib/usr/lib を検索ディレクトリに指定しないでください。

詳細は、「B.2.37 -I[-|dir]」の節を参照してください。