条件付きコンパイル その2 #undefと#ifndef

アレサ 「次は


#undef マクロの定義名 


を導入しましょう。


この#undef マクロの定義名 を


同じマクロの定義名をもつ


#define マクロの定義名


の後に記述すれば


同じマクロの定義名をもつ


#define マクロの定義名


を無効にすることがすることができます。


よって


#define マクロの定義名


が存在することによって機能する


#ifdef  マクロの定義名

命令文

#endif


の中の命令文は実行されない=条件付きコンパイルは実行されないことになります。


先程のエピソードのプログラムに


この


#undef マクロの定義名を組み込んでみると


先程のプログラムは

#include<stdio.h>


#define TKOS 5

#define DEBUGGING/*マクロ名をDEBUGGINGにしました。*/

int main(void){

int i=0;

int sum=0;

int str[]={1,2,3,4,5};


#ifdef DEBUGGING

printf("%d\n",str[0]);

printf("%d\n",str[1]);

printf("%d\n",str[2]);

printf("%d\n",str[3]);

printf("%d\n",str[4]);

#endif


for(i=0;i<TKOS;i++){

sum+=str[i];

}

printf("配列に格納された数値の合計は%dです\n",sum);

return 0;

}

コンパイル結果

1

2

3

4

5

配列に格納された数値の合計は15です



次のように


#undef DEBUGGINGが導入され


コンパイル結果が変化します。


#include<stdio.h>


#define TKOS 5

#define DEBUGGING/*マクロ名をDEBUGGINGにしました。*/

int main(void){

int i=0;

int sum=0;

int str[]={1,2,3,4,5};


#undef DEBUGGING

/*ここで #undef DEBUGGINGを導入しました(´▽`*)

#define DEBUGGINGを無効化するには

同じマクロの定義名 DEBUGGINGをもちいて#undef DEBUGGINGと記述します*/



#ifdef DEBUGGING

printf("%d\n",str[0]);

printf("%d\n",str[1]);

printf("%d\n",str[2]);

printf("%d\n",str[3]);

printf("%d\n",str[4]);

#endif


for(i=0;i<TKOS;i++){

sum+=str[i];

}

printf("配列に格納された数値の合計は%dです\n",sum);



return 0;

}


コンパイル結果


配列に格納された数値の合計は15です




アレサ

「#define DEBUGGINGのあとに

#undef DEBUGGINGが記述されると


#ifdef DEBUGGING

printf("%d\n",str[0]);

printf("%d\n",str[1]);

printf("%d\n",str[2]);

printf("%d\n",str[3]);

printf("%d\n",str[4]);

#endif

内の

命令文

printf("%d\n",str[0]);

printf("%d\n",str[1]);

printf("%d\n",str[2]);

printf("%d\n",str[3]);

printf("%d\n",str[4]);

が実行されていないのがわかりますね(´▽`*)


ここで


もともと条件付きコンパイルでもなく


マクロの定義名も異なる


#define TKOS 5 は


#undef DEBUGGINGによって無効になりません。」


ソーラー「つまり この#undef DEBUGGINGをつかえば


#define DEBUGGINGの記述を消さなくても


#ifdef DEBUGGING

printf("%d\n",str[0]);

printf("%d\n",str[1]);

printf("%d\n",str[2]);

printf("%d\n",str[3]);

printf("%d\n",str[4]);

#endif


の中の命令文を実行しないようにできるってことだね。」


アレサ「はい 次に 導入するのが


#ifndef  マクロの定義名となります。」


ソーラー 「いふんdef?」


アレサ「かわいらしいお名前の この


#ifndef (if not def= ifndef) は


#define マクロの定義名 が記述されていないときに


実行されるという性質をもっています。


実際にプログラム内で#ifndefの動作を確認してみましょう。


#include<stdio.h>

int main(void){


#ifndef DEBUGGING

printf("ifndefです\n");

#endif


return 0;

}

コンパイル結果

ifndefです


アレサ「


#ifndef DEBUGGING

printf("ifndefです\n");

#endif

#define DEBUGGING

#ifdef DEBUGGING

printf("ifdefです\n");

#endif

と同等のはたらきをしているわけです。


🍓 🍓 🍓 🍓 🍓

#ifdef DEBUGGINGは

if define DEBUGGINGという意味であり


もし DEBUGGINGがdefineされていれば


つまり

#define DEBUGGINGがおこなわれていれば


#ifdef DEBUGGINGと#endifで

はさまれた命令文は実行されることになります。


それに対し


#ifndef DEBUGGINGは

if not define DEBUGGINGという意味であり


もし DEBUGGINGがdefineされていなければ


つまり

#define DEBUGGINGがおこなわれていなければ



#ifndef DEBUGGINGと#endifで

はさまれた命令文は実行されることになります



🍓 🍓 🍓 🍓 🍓


次のプログラムをご覧ください



#include<stdio.h>


int main(void){


#define DEBUGGING


#ifdef DEBUGGING

printf("ifdefが実行されました\n");

#endif


#ifndef DEBUGGING

printf("ifndefが実行されました\n");

#endif


return 0;

}

コンパイル結果

ifdefが実行されました


このプログラムでは


#define DEBUGGING

#ifdef DEBUGGING

printf("ifdefが実行されました\n");

#endif

と記述されています。


#define DEBUGGINGが

記述してあれば 


#ifdef DEBUGGINGと#endif

ではさまれた命令文

printf("ifdefが実行されました\n");

実行されることになります


そして


#define DEBUGGINGが

記述してなければ


#ifndef DEBUGGINGと#endif

ではさまれた

命令文

printf("ifndefが実行されました\n");

実行されるのですが


#define DEBUGGINGが

記述してあるので


printf("ifndefが実行されました\n");

実行されないのですね。



ですので

コンパイル結果は

ifdefが実行されました

となります。」




  • Twitterで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます