C ヘッダファイル

ヘッダファイルは拡張子が .h の.hファイルであり、C 関数の宣言とマクロ定義が含まれており、複数のソースファイルから参照・共有されます。

プログラムでヘッダファイルを使用するには、C プリプロセッサ指令を使用する必要があります。#includeそれを使ってインクルードします。前に私たちはすでに stdio.hstdio.hヘッダファイルを見ました。それはコンパイラに付属するヘッダファイルです。

ヘッダファイルをインクルードすることは、ヘッダファイルの内容をコピーすることに相当します。しかし、ソースファイルにヘッダファイルの内容を直接コピーすることはありません。なぜなら、そうすると特にプログラムが複数のソースファイルから構成されている場合に、エラーが発生しやすくなるからです。

C または C++ プログラムにおける簡単なプラクティスとして、すべての定数、マクロ、システム全体のグローバル変数、関数プロトタイプをヘッダファイルに記述し、必要なときにいつでもこれらのヘッダファイルをインクルードすることを推奨します。

ヘッダファイルをインクルードする構文

プリプロセッサ指令を使用して#includeユーザーおよびシステムのヘッダファイルをインクルードできます。その形式には次の2つがあります。

#include <file>

この形式はシステムヘッダファイルをインクルードするために使用します。システムディレクトリの標準リスト内で file という名前のファイルを検索します。ソースコードをコンパイルする際には、-I オプションを使用してディレクトリをそのリストの前に置くことができます。

#include "file"

この形式はユーザーヘッダファイルをインクルードするために使用します。現在のファイルを含むディレクトリ内で file という名前のファイルを検索します。ソースコードをコンパイルする際には、-I オプションを使用してディレクトリをそのリストの前に置くことができます。

ヘッダファイルをインクルードする操作

#include指令は C プリプロセッサに、指定されたファイルを入力として読み込むように指示します。プリプロセッサの出力には、すでに生成された出力、参照されたファイルから生成された出力、および#include指令の後のテキスト出力が含まれます。例えば、次のようなヘッダファイル header.h がある場合:

char *test (void);

そして、そのヘッダファイルを使用するメインプログラムがprogram.c次のようである場合:

int x;
#include "header.h"

int main (void)
{
   puts (test ());
}

コンパイラは次のようなコード情報を参照します:

int x;
char *test (void);

int main (void)
{
   puts (test ());
}

ヘッダファイルを一度だけインクルードする

ヘッダファイルが2回インクルードされると、コンパイラはヘッダファイルの内容を2回処理するため、エラーが発生します。これを防ぐための標準的な方法は、ファイルの内容全体を条件付きコンパイル文の中に置くことです。次のようになります:

#ifndef HEADER_FILE
#define HEADER_FILE

the entire header file file

#endif

この構造は、一般にラッパーと呼ばれます。#ifndef。再度ヘッダファイルをインクルードすると、HEADER_FILE が定義されているため条件は偽になります。このとき、プリプロセッサはファイルの内容全体をスキップし、コンパイラはそれを無視します。

条件付きインクルード

複数の異なるヘッダファイルから1つを選択してプログラムにインクルードする必要がある場合があります。例えば、異なるオペレーティングシステムで使用する設定パラメータを指定する必要がある場合です。これは、次のように一連の条件を使用して実現できます:

#if SYSTEM_1
   # include "system_1.h"
#elif SYSTEM_2
   # include "system_2.h"
#elif SYSTEM_3
   ...
#endif

しかし、ヘッダファイルが多い場合、この方法はあまり適切ではありません。プリプロセッサはマクロを使用してヘッダファイルの名前を定義します。これがいわゆる条件付きインクルードです。これは、ヘッダファイルの名前を#includeの直接の引数として使用するのではなく、マクロ名を代わりに使用するだけです:

 #define SYSTEM_H "system_1.h"
 ...
 #include SYSTEM_H

SYSTEM_H が展開され、プリプロセッサは system_1.h を検索します。あたかも#include最初に記述されたかのように。SYSTEM_H は -D オプションを使用して Makefile で定義できます。


標準ライブラリのヘッダファイル

C 標準ライブラリヘッダファイル(Standard Library Header Files)は、ANSI C(C89/C90 とも呼ばれる)および ISO C(C99 と C11)標準で定義された一連のヘッダファイルです。これらのヘッダファイルは、入出力、文字列操作、数学計算、メモリ管理などの一般的なプログラミングタスクを処理するための多数の関数、マクロ、型定義を提供します。

以下は、一般的な C 標準ライブラリヘッダファイルとその機能の概要です:

ヘッダファイル 機能概要
<stdio.h> 標準入出力ライブラリ。printf、scanfprintf、scanf などの関数を含む。
<stdlib.h> 標準ライブラリ関数。メモリ割り当て、プログラム制御などの関数を含む。
<string.h> 文字列操作関数(例:strcpy、strlen など)strlen、strcpy 等
<math.h> 数学関数ライブラリ(例:sin、cos など)sin、cos、sqrt 等
<time.h> 時間および日付関数(例:time、ctime など)time、strftime 等
<ctype.h> 文字処理関数(例:isalpha、isdigit など)isalpha、isdigit 等
<limits.h> 各種型の制限値を定義します(例:INT_MAX など)INT_MAX 等
<float.h> 浮動小数点型の制限値を定義します(例:FLT_MAX など)FLT_MAX 等
<assert.h> アサーションマクロ assertassert、デバッグチェックに使用されます。
<errno.h> エラーコード変数 errno を定義します。errnoおよび関連マクロ。
<stddef.h> 汎用型とマクロを定義します(例:size_t など)size_t、NULL 等
<signal.h> シグナルを処理する関数とマクロ(例:signal など)signal 等
<setjmp.h> 非ローカルジャンプ機能を提供するマクロと関数。
<locale.h> 地域化(ロケール)関連の関数とマクロ(例:setlocale など)setlocale 等
その他の拡張