C 言語 | 前処理 | インクルード - #include
コンパイル前に処理される #include プリプロセッサディレクティブを使うと、宣言などをまとめたヘッダーファイルを各ソースファイルに取り込める。この処理をインクルード(include)と呼ぶ。
ヘッダーファイルの作成
複数のファイルで構成される中規模以上の開発プロジェクトでは、プログラミング手法だけでなく、ファイル構成も重要になる。ここで扱う小さなテストプログラムなら 1 つのファイルで十分だが、実際の開発はそうではない。開発メンバーは 1 人とは限らず、あるグループはグラフィック、別のグループは音声というように、異なる分野を同時に開発することもある。これらを 1 つのファイルだけで管理することはできない。
論理的に分離された機能をファイルごとに開発する場合、最後にまとめてコンパイルする必要がある。一般に、main() 関数を含み、実行ファイルの作成に使うソースファイルには *.c という拡張子を付ける。それ以外のライブラリの役割や機能群を提供するファイルは、*.h という拡張子を持つヘッダーファイルにする慣習がある。ヘッダーファイルは main() 関数の前に挿入される。
複数のファイルをまとめてコンパイルするには、#include プリプロセッサディレクティブを使い、指定した位置にヘッダーファイルを挿入するようコンパイラーに伝える。コンパイラーは #include を見つけると、その位置に指定されたファイルを挿入する。これまでは #include <stdio.h> のように記述し、C 言語が標準で提供するライブラリファイルを取り込んできた。この処理をインクルードと呼ぶ。
標準ファイル以外をインクルードする場合は、#include "ファイル名" のようにファイル名を二重引用符で囲む。この方法は 初めての C 言語 で説明した。コンパイラーがファイルを検索する方法については、利用しているコンパイラーのドキュメントを参照すること。二重引用符で囲まれている場合、通常は *.c ファイルと同じディレクトリが検索される。
インクルードは、単純にファイルを挿入する処理だと考えればよい。# で始まる命令はコンパイラーではなく、プリプロセッサに対する命令である。前処理はソースコードのコンパイル前に実行される。#include はファイルを挿入する命令なので、コンパイラーがソースコードを処理する前に、指定された位置へファイルの内容をそのまま挿入する。開発者は共通の関数宣言などをヘッダーファイルに記述し、プロジェクトの C ソースファイルに取り込める。これにより、同じ宣言を何度も記述する必要がなくなる。
コード 1
/* sample.h */
int strlen(const char *str);
コード 2
int strlen(const char *str) {
int count;
for(count = 0 ; *(str + count) ; count++);
return count;
}
コード 3
#include <stdio.h>
#include "sample.h"
int main() {
char *str = "Kitty on your lap";
printf("%s length=%d\n" , str , strlen(str));
return 0;
}
コード 1 のヘッダーファイルを作成し、コード 3 にインクルードしてコンパイルする。すると、#include "sample.h" と記述した位置にヘッダーファイルの内容がそのままコピーされ、コンパイルされる。コード 1 では、NULL 文字を除いた文字列の文字数を返す strlen() 関数を宣言している。strlen() 関数の実装はコード 2 に記述している。このようなヘッダーファイルを一度作成すれば、さまざまな開発プロジェクトで再利用できる。