条件付きコンパイル その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が実行されました
となります。」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます