ヘッダファイルとは
ヘッダファイルは、主に
C言語や
C++で利用される
ソースコード形式のファイルです。
コンパイラによって、別のソースファイルの一部として自動的に展開され、利用されます。一般的に、ソースファイルの先頭部分に記述されたディレクティブによってインクルード(内容を展開)されます。インクルードファイルとも呼ばれます。
ヘッダファイルには、主に
サブルーチン(関数)や変数、その他の
識別子の前方宣言が含まれています。複数のソースファイルで共有する必要がある
識別子を1つのヘッダファイルに集約し、各ソースファイルが必要に応じてインクルードすることで、コードの重複を避け、保守性を高めることができます。
C/
C++では、標準ライブラリの関数もヘッダファイルで宣言されています(ただし、規格上ヘッダファイルは必ずしもファイルである必要はありません)。標準Cライブラリや標準
C++ライブラリの詳細については、それぞれのドキュメントを参照してください。
ヘッダファイルの背景
近年の
プログラミング言語では、プログラムは
サブルーチンなどの小さなコンポーネントに分割され、各
サブルーチンは複数のファイルに配置され、個別にコンパイルされることが一般的です。ある
サブルーチンが他のファイルで定義された機能を利用する場合、前方宣言や関数
プロトタイプが必要となります。
例えば、あるソースファイルで以下のような関数が定義されているとします。
c
int add(int a, int b) {
return a + b;
}
この関数を別のソースファイルで利用する場合、通常は以下のように関数
プロトタイプを宣言する必要があります。
c
int add(int a, int b);
しかし、この方法では、プログラマが`add`関数の宣言を定義ファイルと利用ファイルの2箇所で管理する必要が生じます。関数の定義が変更されるたびに、関数
プロトタイプも変更する必要があり、保守の手間が増大します。
ヘッダファイルはこの問題を解決します。ヘッダファイルでは、外部に公開する関数、オブジェクト、データ型などの宣言を記述します。上記の例であれば、ヘッダファイルには`add`関数の宣言が含まれます。そして、`add`関数を利用する各ソースファイルは、`#include`ディレクティブを用いてこのヘッダファイルを導入します。
ヘッダファイルの利点
ヘッダファイルを利用することで、以下のような利点が得られます。
保守性の向上: 関数の定義が変更された場合、ヘッダファイルの宣言のみを修正すれば、プログラム全体の整合性を保つことができます。ただし、変更内容によってはヘッダファイルの修正だけでは済まない場合もあります。
コンパイル時のチェック: ヘッダファイルは、宣言が定義と一致しているか
コンパイラがチェックするのに役立ちます。
インターフェースの明確化: ヘッダファイルは、外部に公開する機能のインターフェースを明確化する役割を担います。また、ヘッダファイルには、宣言されたコンポーネントの使い方を説明するコメントを含めることが推奨されます。
ヘッダファイルと実装
ヘッダファイルはインターフェースを提供するためのものであり、具体的な実装は別のソースファイルに記述し、個別にコンパイルされます。C/C++における例外として、インライン関数があります。インライン関数の展開はコンパイル時に定義が必要となるため、ヘッダファイルに記述されることが多いです。
ヘッダファイルの代替手法
ヘッダファイル以外にも、他のファイルで定義された識別子の宣言にアクセスする方法は存在します。ヘッダファイルの場合、実装ファイルとヘッダファイルの2か所を同期させる必要があります。
ヘッダファイルを利用しないプログラミング言語も存在します。例えば、Javaではパッケージにより、コンパイラが識別子を把握できるようにしています。また、モジュールという仕組みで同様の機能を実現する言語もあります。C++においても、モジュールの導入が検討されています。
脚注
C++では、
モジュールの導入が進められています。
関連項目
Application Programming Interface (API)
インターフェース記述言語
プロトタイプ
マクロ
外部リンク
C++ プログラミングガイド 第2章 プログラムの構成 (サン・マイクロシステムズ)
C++ header file inclusion rules