コンパイラに付属の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が展開され、プリプロセッサは#includeが元々そのように書かれているかのようにsystem_1.hを探します。 SYSTEM_HはMakefileによって-Dオプションで定義できます。
No comments:
Post a Comment