Cprogramming-c-header-files

提供:Dev Guides
移動先:案内検索

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オプションを使用して定義できます。