Project_OKI’s diary

エンジニアの勉強ブログ

C言語基礎知識12(#ifとは:条件付きコンパイル)

​​​

#ifとは

・目次

 

1.#ifとは

  (1) 条件付きコンパイル
 
  (2) 条件に合った部分の処理だけをコンパイル対象とする。
 
  (3) debugの時や、コメントアウトなどに使用される。
 
 

2.#if,#elif,#else,#endifの使い方

(1) 使用方法、書き方
 使用方法1
//**********************************************************
 // 構文
  #if 条件
       //条件式1が成立するの時に実行する処理 (ブロック1)
    何らかの処理
 #elif 条件
    // 条件式1が成立しないで条件2が成立する時の処理
    何らかの処理
 #else
       //条件式1も条件式2も成立しない時の処理 (ブロック3)
    何らかの処理
 #endif
 //**********************************************************
 
 
 使用方法2
 //**********************************************************
 //if 0と1を切り替えることで、実行するプログラムの切り替えが出来る。        
  #if 0
  //実行されない
  #else
  //実行される
  #endif
  
  #if 1
  //実行される
  #else
  //実行されない
  #endif
  //**********************************************************
 ※#ifから#endifを一つのかたまりとして扱う。 
 
 
 使用方法3
 //**********************************************************
 //if 0と1を切り替えることで、実行するかどうか、切り替えが出来る。
 //コメントアウトの代わりにもなる。       
  #if 0
  //実行されない
  #endif
  
  #if 1
  //実行される
  #endif
  //**********************************************************
 
 
 使用方法4
 //**********************************************************
 //0と1を切り替えることで、実行するかどうか、切り替えが出来る。
 //コメントアウトの代わりにもなる。
  #define DEBUG 1
  #define DEBUG2 0
        
  #if DEBUG
  //実行される
  #endif
  
 //#define DEBUG2が無効
  #if DEBUG2
  //実行されない
  #endif
  //**********************************************************
 
(2) 使用例(使用方法1:#if , #elifを使用する1)
 プログラムの内容:
   test2を有効にし、実行確認するプログラム。
#include <stdio.h>

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

int main(void)
{
#if test1 //test1が有効(0以外の時)実行
    printf("ifdef"); 
    
#elif test2 //test1が無効状態かつtest2が有効の時実行
    printf("elif");  //実行される。
    
#else //test1もtest2も無効の時実行
    printf("else");

#endif
    return 0;
}
   
  #defineによって、test2を1に置き換える。
  #if test1は、test1が有効の時実行される。 
  #define test1は、コメントアウトされているため実行されない。
 
  コメントアウトを外すと、test1側が実行される。
    #define test2もコメントアウトすると、#elseが実行される。
 
  ここでは、#define test1 1をコメントアウトしているが。
  #define test1 0 でも、test1は無効状態と認識する。
(3) 使用例(使用方法1: #if , #elifを使用する2)
 プログラムの内容:
  #define zyouken xxのxxにより、処理するプログラムを変更するプログラム
#include <stdio.h>

#define test1 0 //0をtest1に置き換える。
#define test2 1 //1をtest2に置き換える。
#define test3 2 //1をtest2に置き換える。

#define zyouken test3 //test3の処理を実行する。

int main(void)
{
#if zyouken == test1 //zyoukenがtest1の時実行
    int a = zyouken;
    printf("if_test1:%d",a);  //実行されない。
    
#elif zyouken == test2 //zyoukenがtest2の時実行
    int a = zyouken;
    printf("elif_test2:%d",a);  //実行されない。

#elif zyouken == test3  //zyoukenがtest3の時実行
    int a = zyouken;
    printf("elif_test3:%d",a);  //実行する。
    
#else 
    printf("else");

#endif
  return 0;
}

実行結果:​https://paiza.io/projects/MEuJOgL6CgZiDOktCQIVPQ?language=c

  #define  zyouken test1ならtest1
  #define zyouken test2ならtest2
  #define zyouken test3ならtest3
  それ以外なら#else
   が実行される。
(4) 使用例(使用方法2:#define、#elseによる切り替えプログラム)

 プログラム内容:

  #else側のプログラムを実行する。

  #ifと#elseの役割を確認するプログラム。

#include <stdio.h>

int main(void)
{
#if 0
    printf("#ifが0以外の時実行"); 
#else 
    printf("#ifが0の時実行");
#endif
    return 0;
}

実行結果:​https://paiza.io/projects/kRWjiUGkXYPO1JbQcQ0OCA?language=c

 

(5) 使用例(使用方法3:コメントアウト):一番良く使う。

 プログラム内容:

  #if 0から#endifまでの部分は実行されない。

#include <stdio.h>

int main(void)
{
#if 0
    printf("#ifが0以外の時実行_1"); 
#endif

#if 1
   printf("#ifが0以外の時実行_2"); 
#endif

    return 0;
}

実行結果:https://paiza.io/projects/OxNeFuDs7Y1UASHH2ZbOEA?language=c

(6) 使用例(使用方法4:#defineによる有効、無効)

 プログラム内容:

  #if 0から#endifまでの部分は実行されない。

#include <stdio.h>

#define DEBUG 1
#define DEBUG2 0

int main(void)
{
#if DEBUG
    printf("DEBUGが有効の時実行\n"); 
#endif

#if DEBUG2
   printf("DEBUG2が有効の時実行\n"); 
#endif

    return 0;
}

実行結果:https://paiza.io/projects/h9-G2rqQImLkY07NHDKg6Q?language=c

 #define DEBUG 1のみ実行される。

 #define DEBUG 0又は、#defineでDEBUGがないと実行されない。

 デバック用プログラムなど、デバック時にのみ有効にしたいプログラムを

 入れる場合に使える。

 

関連記事

過去の記事:

知らないと損するお金の話(ふるさと納税、確定申告とワンストップ納税どっちが得?) - Project_OKI’s diary

C言語基礎知識6(関数) - Project_OKI’s diary

C言語基礎知識7(構造体1) - Project_OKI’s diary

C言語基礎知識8(enum:列挙型) - Project_OKI’s diary

C言語基礎知識9(typedef) - Project_OKI’s diary

C言語基礎知識10(extern宣言) - Project_OKI’s diary

C言語基礎知識11(#define) - Project_OKI’s diary