C ヘッダー ファイル


ヘッダファイルは拡張子.hのファイルで、Cの関数宣言やマクロ定義が含まれており、複数のソースファイルで参照・共有されます。ヘッダー ファイルには、プログラマが作成するヘッダー ファイルとコンパイラが提供するヘッダー ファイルの 2 種類があります。

プログラムでヘッダー ファイルを使用するには、C 前処理ディレクティブ #include を使用してそれを参照する必要があります。 stdio.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 ());}

ヘッダー ファイルは 1 回だけ参照してください

ヘッダー ファイルが 2 回参照されると、コンパイラーはヘッダー ファイルの内容を 2 回処理するため、エラーが生成されます。これを防ぐには、次のようにファイルの内容全体を条件付きコンパイル ステートメントに入れるのが標準的な方法です。

#ifndef HEADER_FILE#define HEADER_FILE

the entire header file file#endif

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

条件付き参照

場合によっては、プログラムへの複数の異なるヘッダー ファイルから参照を選択する必要があります。たとえば、さまざまなオペレーティング システムで使用するための構成パラメータを指定する必要があります。これは、次のような一連の条件によって実現できます:

#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 が展開され、プリプロセッサは #include と同様に system_1.h を探します。 はもともとそのように書かれていました。 SYSTEM_H は、Makefile で -D オプションを使用して定義できます。