多重インクルード防止
多重インクルード防止
多重インクルード防止:
ヘッダファイルが複数ある場合に、同じ名前のものがあるとエラーを起こす
その為に、多重にインクルードされるのを防止する必要がある。
書き方
プリプロセッサの「条件コンパイル」と「マクロ定義」を利用して書きます。この記述を「多重インクルード防止」という
何か重要な処理に先立って、その準備として実行される処理を「前処理(preprocess)」と呼んでいます。プリプロセッサは、本来のコンパイル処理に先立って、その準備となる処理を実行するので、前処理プログラムと呼ばれるわけです。C 言語に関するものであることを明示したいときには「C プリプロセッサ」と呼びます
プリプロセッサで処理させる命令をプリプロセッサ命令またはプリプロセッサディレクティブといいます。
プログラムの出力までの処理:
プログラム→ プリプロセッサ処理 →コンパイル → コンパイル結果の出力
ここのプリプロセッサで処理されるのが、プリプロセッサ命令といわれるものっぽい。
code:c
//よく使われるプリプロセッサ命令
//例
//PIを使用すると、3.14159265が使用されたことになる。
v = 3 * PI;
//出力結果: v=3×3.14159265=.42477795
//if 0と1を切り替えることで、実行するプログラムの切り替えが出来る。 コメントアウトの代わりにもなる。
//実行されない
//実行される
//実行される
//実行されない
code:c
#ifdef //条件コンパイル:プログラムの中で不要な部分をカットする事が出来る。 //if(もし) def(#define)が定義されていたら、実行する
//#define DEBUG_ON
int main(void)
{
printf("Hello"); //#define DBUG_ONが無いため、実行されない。
printf("World"); //実行される
return 0;
}
dddddd
int main(void)
{
#ifdef DEBUG_ON //#define DBUG_ONがあるため、実行される。 printf("Hello");
printf("World");
return 0;
}
# ifdefの理解が出来た気がする。これを使って、多重インクルードを防止する。
code:c
//#define DEBUG_ON
int main(void)
{
printf("Hello"); //#define DBUG_ONが無いため、実行される。
printf("World");
return 0;
}
int main(void)
{
printf("Hello"); //#define DBUG_ONがあるため、実行されない。
printf("World");
return 0;
}
多重インクルード:
code:c
// sub.hというファイルを作成する場合
#ifndef SUB_H //#define SUB_Hが実行されて無ければ、#define SUB_Hを実行し、 #define SUB_Hが既に実行されてあれば、#define SUB_Hを実行しない。 // ・・・ヘッダ定義の詳細・・・
疑似的に、やってみると。
code:c
int main(void)
{
#ifndef SUB_H //SUB_Hが無いか確認、無い場合下記endifまでを実行 #define D_SUB_NUM (100) //D_SUB_NUMを100にする。 #ifndef SUB_H //SUB_Hが無いか確認、無い場合下記endifまでを実行。ある場合は実行しない。 #define D_SUB_NUM (200) //D_SUB_NUMを100にする。 int x = D_SUB_NUM;
printf("出力結果:%d",x);
}
//出力結果:100 とでる。
//上側の#defineが無ければ、したの処理が有効になるため、出力結果:200となる。