#ifdef、#ifndefとは
・目次
1.#ifdefとは
2.#ifdefの使い方
(1) 使用方法、書き方
// 構文
#ifdef 定義1
//定義1が定義されている実行する処理 (ブロック1)
何らかの処理
#else
//定義1が定義されてない時の処理 (ブロック3)
何らかの処理
#endif
//**********************************************************
(2) 使用例(#ifdefを使用する)
#include <stdio.h> #define test1 1 //test1の処理を実行する。 int main(void) { #ifdef test1 //test1が定義されている時実行 printf("ifdef"); //実行する。 #else //test1もtest2も定義されてない時時実行 printf("else"); #endif return 0; }
3.#ifdefと#ifの違い
・#ifについては下記を参照
→
(1)#ifdefと#ifの違い
・#ifdefは、#defineによって定義されていれば、実行される。
#ifは、#defineによって定義されていても、0の場合は無効。
・#if 0をすると、コメントアウトされるが、#ifdef 0は使えない。
(2) プログラム作成(#ifdefと#ifの違いの確認)
#defineによって、0と1を置き換えた時の違い。
#include <stdio.h> #define test1 0 //test1の処理を実行する。 #define test2 1 //test2の処理を実行する。 int main(void) { //#define test1によって制御 #ifdef test1 //test1が定義されている時実行 printf("test1:ifdef\n"); //実行される。 #endif #if test1 //test1が有効の時実行 printf("test1:if\n"); //test1が0と無効の為、実行されない。 #endif //#define test2によって、制御 #ifdef test2 //test2が定義されている時実行 printf("test2:ifdef\n"); //実行される。 #endif #if test2 //test2が有効の時実行 printf("test2:if\n"); //実行される。 #endif return 0; }
実行結果:https://paiza.io/projects/vYgoJG2WCz0QJUCf7Ibngw?language=c
#defineの時のみと、#ifdef 1の確認
#include <stdio.h> #define test1 //test1を定義 int main(void) { //#define test1によって制御 #ifdef test1 //test1が定義されている時実行 printf("test1:ifdef\n"); //実行される。 #endif //#if test1 //test1が定義のみなので、有効にするとエラーが発生。 // printf("test1:if\n"); //#endif //#ifdef 1 //1になっているため、有効にするとエラーが発生 // printf("test2:ifdef\n"); //#endif #if 1 //有効化 printf("test2:if\n"); //実行される。 #endif return 0; }
実行結果:https://paiza.io/projects/wlq95YN1-88YI0HoEkQ5wg?language=c
4.#ifndefとは
(1) 条件付きコンパイル
(2) #defineによって、定義されている場合コンパイル対象外とし、定義されてない場合実行する。
5.#ifndefの使い方
(1) 使用方法、書き方
// 構文
#ifndef 定義1
//定義1が定義されていない時、実行する処理 (ブロック1)
何らかの処理
#else
//定義1が実行されている時、実行する処理 (ブロック2)
何らかの処理
#endif
//**********************************************************
(2) 使用例(#ifndefの使用)
#include <stdio.h> //#define test1 //test1の処理を未実行 int main(void) { #ifndef test1 //test1が定義されてない時実行 printf("ifndef"); //実行する。 #else //test1が定義されてる時時実行 printf("else"); #endif return 0; }
実行結果:https://paiza.io/projects/KtndFBT0U9qcnLjjjUpyIg?language=c
・#define test1はコメントアウトされているため、#ifndef test1が実行される。
コメントアウトを外すと、#elseが実行される。
(3) #ifndefによる多重インクルード防止
・C言語において、ファイルを複数使用する場合がある。
・ヘッダファイルが複数ある場合に、同じ名前のものがあるとエラーを起こす。
・このヘッダが同じ名前のものがあってもエラーにならないように、#ifndefを使用し、
ヘッダファイルが複数インクルードされないようにする。
・これを多重インクルード防止という。
疑似的に、やると。
#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); }
実行結果:https://paiza.io/projects/kuQ-K8OgOSCgYdIDGEjQ2w?language=cpp
・一個目の#ifndef SUB_Hは、#defineがその上で宣言されていないため、
実行される。
・ #define SUB_H //SUB_Hを宣言
#define D_SUB_NUM (100) //D_SUB_NUMを100にする。
が有効になる。
・2個目の#ifndef SUB_Hは、すでに上で宣言されているため、実行されない。
実際のヘッダファイルでは、下記のように書く。
//**********************************************************
#ifndef ファイル名(大文字)_H
#define ファイル名(大文字)
ヘッダファイルの内容
#endif //ヘッダファイルの終わり。
//**********************************************************
// sub.hというファイルを作成する場合 #ifndef SUB_H //#define SUB_Hが実行されて無ければ、#define SUB_Hを実行。
//#define SUB_Hが既に実行されてれば、#define SUB_Hを実行しない。 #define SUB_H
// ・・・ヘッダ定義の詳細・・・
#endif
このようにすることによって、sub.hファイルがインクルードされると。
自動的に#define USB_Hが宣言される。
関連記事
C言語:
・組み込みの為のC言語基礎知識1(printf) - Project_OKI’s diary
・C言語基礎知識2(for分で処理を繰り返す) - Project_OKI’s diary
・C言語基礎知識3(配列) - Project_OKI’s diary
・STM32マイコン_2(UART通信:TeraTermにHellow表示) - Project_OKI’s diary
・STM32マイコン_3(UART通信:複数文字送信) - Project_OKI’s diary
・STM32マイコン_4(NVICの設定内容) - Project_OKI’s diary
・STM32マイコン_5(スイッチ入力とLED点灯、消灯) - Project_OKI’s diary