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 に記述している。このようなヘッダーファイルを一度作成すれば、さまざまな開発プロジェクトで再利用できる。