Oracle® Developer Studio 12.5: C ユーザーズガイド

印刷ビューの終了

更新: 2016 年 7 月
 
 

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

C コンパイルシステムで提供される標準ヘッダーファイルをインクルードするには、次のフォーマットを使用します。

#include <stdio.h>

角括弧 (<>) によって、プリプロセッサは システム上のヘッダーファイルの標準の場所にあるヘッダーファイルを検索し、 これは通常、/usr/include ディレクトリです。

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

#include "header.h"

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

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

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

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

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

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

さらに、header.h../defs ディレクトリに格納されているとします。このとき、次のコマンドを使用できます:

% cc  –I../defs  mycode.c

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

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

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

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

-I- オプションを使用すると、デフォルトの検索規則をよりきめ細かく制御できます。コマンド行にある最初の -I- オプションだけが、このセクションで説明されているように動作します。

#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 ディレクトリ

次の例は、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.17.1.1 警告

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

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