ヘッダファイル: Header file)は、特にC言語C++でのプログラミングで使われるファイルであり、一般にソースコード形式をしていて、コンパイラが別のソースファイルの一部として自動的に展開して使用する。一般にヘッダファイルは、ソースファイルの先頭部分に書かれたディレクティブによってインクルード(その場に内容を展開)される。インクルードファイル: Include file)とも。

ヘッダファイルには、サブルーチン変数やその他の識別子前方宣言が含まれていることが多い。複数のソースファイルで宣言する必要のある識別子を1つのヘッダファイルに置き、必要に応じて個々のソースファイルがそのヘッダファイルをインクルードする。

C言語C++では、標準ライブラリ関数はヘッダで宣言されている(ただし、規格上ヘッダは必ずしもファイルであるとは限らない[1])。詳しくは、標準Cライブラリ標準C++ライブラリを参照されたい。

背景

編集

最近の多くのプログラミング言語では、プログラムサブルーチンなどの小さなコンポーネントに分割されており、各サブルーチンは複数の物理的に分割されたファイルに配置され、個々にコンパイルされる。あるサブルーチンがそのファイル以外で定義された何かを使う場合、前方宣言関数プロトタイプといった概念を導入する必要が生じる。例えば、あるソースファイルに次のように関数が定義されるとする。

int add(int a, int b)
{
    return a + b;
}

この関数を別のソースファイルで参照するには、関数プロトタイプで宣言する必要がある。従って、次のようになる。

extern int add(int, int);

int triple(int x)
{
    return add(x, add(x, x));
}

しかし、この単純な手法ではプログラマが add という関数の宣言を二箇所で管理しなければならなくなる。すなわち、実装が書かれたファイルとそれを使っているファイルである。その関数の定義が変更された場合、プログラマはプログラムのあちこちにある関数プロトタイプも全て更新しなければならない。

ヘッダファイルはこの問題を解決するものである。モジュール化されたヘッダファイルでは、そのモジュールが外部に公開する個々の関数、オブジェクト、データ型などの宣言をする。例えば、上記の例ではヘッダファイルには add の宣言が含まれるだろう。add を使っている各ソースファイルでは、そのヘッダファイルを #include ディレクティブを使って導入する。

#ifndef H_ADD
#define H_ADD

extern int add(int, int);

#endif
#include "add.h"

int triple(int x)
{
    return add(x, add(x, x));
}

これにより保守の負担が低減される。定義が変更された場合、ヘッダファイルにある宣言だけを更新すれば済む(変更内容によってはそれだけでは済まないこともある)。ヘッダファイルは、その中で宣言されたものの実体が定義されているソースファイルにもインクルードされることがある。これにより、コンパイラが定義と宣言が一貫しているかをチェックできる。

#include "add.h"

int add(int a, int b)
{
    return a + b;
}

一般にヘッダファイルはインタフェースだけを提示するのに使われ、そこで宣言されたコンポーネントの使い方をある程度解説する文書を(コメントなどで)含んでいることが多い。上記の例では、サブルーチンの実装は別のソースファイルにあり、個別にコンパイルされる。C言語やC++における例外としてインライン関数がある。多くの実装ではインライン関数の展開はコンパイル時にその定義がないとできない実装になっていることが多いためである。

代替手法

編集

ヘッダファイル以外にも、他のファイルで定義された識別子の宣言にアクセスする方法はある。ヘッダファイルの場合、実装しているファイルと宣言しているヘッダファイルの2ヶ所の更新を同期させる必要がある。

ヘッダーファイルという方法を用いないプログラミング言語もある。Javaなどの言語では、パッケージにより、コンパイラが把握できるようにしている。モジュールという名称で、同様の機能を有する言語もある。C++においても、モジュールの仕組みが提案されている[2]

脚注

編集
  1. ^ C11 standard, 7.1.2 Standard headers, p. 181, footnote 182: "A header is not necessarily a source file, nor are the < and > delimited sequences in header names necessarily valid source file names.
  2. ^ A Module System for C++ (Revision 4)” (PDF) (英語). JTC1/SC22/WG21 - The C++ Standards Committee (2016年2月15日). 2016年6月5日閲覧。

関連項目

編集

外部リンク

編集