Project_OKI’s diary

エンジニアの勉強ブログ

C言語基礎知識15(#ifdef、#ifndefとは:条件付きコンパイル2)

​​​#ifdef、#ifndefとは

・目次

 

 1.#ifdefとは

  (1) 条件付きコンパイル
  (2) #defineによって、定義されている場合コンパイル対象とする。
  (3) #if defineの略で、#if defineの書き方も出来る。
    (elifは#else if の略であり、#elif 条件のみ使用可能、#elif defineは無い。)
 

2.#ifdefの使い方

(1) 使用方法、書き方
 使用方法
//**********************************************************
 // 構文
  #ifdef 定義1
       //定義1が定義されている実行する処理 (ブロック1)
    何らかの処理
 #else
       //定義1が定義されてない時の処理 (ブロック3)
    何らかの処理
 #endif
 //**********************************************************
(2) 使用例(#ifdefを使用する)
 プログラムの内容:
   test1を有効にし、実行確認するプログラム。
#include <stdio.h>

#define test1 1 //test1の処理を実行する。

int main(void)
{
#ifdef test1            //test1が定義されている時実行
    printf("ifdef");    //実行する。
    
#else                   //test1もtest2も定義されてない時時実行
    printf("else");

#endif
    return 0;
}
   
  #defineによって、test1を1に置き換える。
  #define test1は、が定義されているため、
   printf("ifdef"); が実行される。
 
  ※ここでは #define test1 1としているが、
  下記のように、定義されていれば実行される。
  #define test1
       #define test1 0
    
  #define test1をコメントアウトすると、
  #elseのprintf("else");が実行される。
 
  ※注意:
  #ifdef の後に、#elifを使用することができるが。
  #elifは#else if の省略の為、
  #elifで定義の有無による実行の選択はできない。
 
  その為、
  #define  test2
       #elif test2
  のように、定義のみした場合、#elifはエラーとなる。
  (基本#ifdefとelifを一緒には使わない方が良い。)
 

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) 使用方法、書き方
 使用方法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言語: