Cprogramming-c-header-files
C-ヘッダーファイル
ヘッダーファイルは、拡張子が .h のファイルであり、複数のソースファイル間で共有されるC関数宣言とマクロ定義が含まれています。 ヘッダーファイルには2つのタイプがあります。プログラマが書き込むファイルと、コンパイラに付属するファイルです。
コンパイラーに付属している stdio.h ヘッダーファイルを含めるように、Cプリプロセスディレクティブ*#include *にヘッダーファイルを含めることで、ヘッダーファイルをプログラムで使用することを要求します。
ヘッダーファイルを含めることはヘッダーファイルのコンテンツをコピーすることと同じですが、エラーが発生しやすく、特にソースファイルにヘッダーファイルのコンテンツをコピーすることはお勧めできません。プログラムに複数のソースファイルがあります。
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 ());
}
コンパイラは、program.cが読み取る場合と同じトークンストリームを参照します。
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が定義されているため、条件はfalseになります。 プリプロセッサーはファイルの内容全体をスキップし、コンパイラーはそれを2回表示しません。
計算されたインクルード
場合によっては、いくつかの異なるヘッダーファイルの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は、Makefileで-Dオプションを使用して定義できます。