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