マクロを使って条件付きコンパイルを行うことができます。
アレサ「😊
以下の
プログラムではint型の配列strの
配列変数
str[0]
str[1]
str[2]
str[3]
str[4]
に
数値1,2,3,4,5をとりこみ
その総和をprintf表示しています。
#include<stdio.h>
#define TKOS 5
int main(void){
int i=0;
int sum=0;
int str[]={1,2,3,4,5};
for(i=0;i<TKOS;i++){
sum+=str[i];
}
printf("配列に格納された数値の合計は%dです\n",sum);
return 0;
}
コンパイル結果
配列に格納された数値の合計は15です
ここで(確かめなくても大丈夫なのですが)
配列変数
str[0]
str[1]
str[2]
str[3]
str[4]
に
数値1,2,3,4,5がきちんと格納されているかどうかを確かめるには
int str[]={1,2,3,4,5};
と数値を格納した後に
次のようにprintf文を記述してみればよいわけです。
printf("%d",str[0]);
printf("%d",str[1]);
printf("%d",str[2]);
printf("%d",str[3]);
printf("%d",str[4]);
そうするとプログラムは次のように書き換えられます。
#include<stdio.h>
#define TKOS 5
int main(void){
int i=0;
int sum=0;
int str[]={1,2,3,4,5};
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]);
for(i=0;i<TKOS;i++){
sum+=str[i];
}
printf("配列に格納された数値の合計は%dです\n",sum);
return 0;
}
コンパイル結果
1
2
3
4
5
配列に格納された数値の合計は15です
アレサ「
配列変数
str[0]
str[1]
str[2]
str[3]
str[4]
にきちんと数値1,2,3,4,5が格納されているのが確認できました。
ここで
1
2
3
4
5
をコンパイル結果に表示したくない場合は
命令文
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]);
を
/*
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 マクロの定義名
#ifdef マクロの定義名(マクロの定義名は自由につけることができます)
命令文
#end if
で 定義、使用することができます。
#define マクロの定義名
と
#ifdef マクロの定義名
の マクロの定義名
は
同じ名前に設定します。
条件付きコンパイルとは
🍊#define マクロの定義名 が宣言されていれば🍎
#ifdef マクロの定義名
命令文
#end if
内の命令文が実行されるというものです。
実際にプログラム内で条件付きコンパイルを使用してみましょう。
デバッグとは プログラムの記述ミスを直す作業のことを言います
プログラムの記述ミスを直すわけではありませんが
マクロ名を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};
#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です
この プログラムをみていただければお分かりになられますように
#define DEBUGGINGが記述されていれば
#ifdef DEBUGGINGと#end ifで囲まれた
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 DEBUGGINGが先頭に記述されていなければ
#ifdef DEBUGGINGと
#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]);
が実行されないということになりますの。
#include<stdio.h>
#define TKOS 5
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;
}
コンパイル結果
配列に格納された数値の合計は15です
ここでこのプログラムのコンパイル結果に
コンパイルエラーが出たとします。
#define DEBUGGINGが記述されていて
#ifdef DEBUGGINGと
#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 DEBUGGINGが記述されず
#ifdef DEBUGGINGと
#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]);
が
実行されない場合は
コンパイルエラーが出ない場合は
#ifdef DEBUGGINGと
#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]);
の中に
プログラムの記述ミスがあり
を
その
プログラムの記述ミスを
訂正すればよいことになります。
このように
#ifdef DEBUGGING
命令文
#endif
と囲んでおけば
#define DEBUGGINGを
記述した場合と
記述しなかった場合のコンパイル結果を比べて
コンパイルエラーの原因となっている命令文を
探し出すことができます。」
ソーラー「#define マクロの定義名が
記述されていれば
という条件付きで
#ifdef マクロの定義名
と
#endif
にはさまれた
命令文が実行(コンパイル)される
条件付きコンパイルというわけなんだね。
#ifdef マクロの定義名
と
#endif
にはさまれた
命令文が実行(コンパイル)されて
コンパイルエラーがでたなら
#ifdef マクロの定義名
と
#endif
にはさまれた
命令文を訂正すればいいというわけなんだね。」
アレサ「
同様に
コメント機能を使って
命令文を
/*命令文*/
のように
/*と*/で
囲むことにより
/*と*/で
囲んだ場合と
囲まなかった場合のコンパイル結果を比べて
コンパイルエラーの原因となっている命令文を
探し出すことができます。
#define DEBUGGINGには
ほかにもいろいろな応用例があります。」
サン・・・ サン・・・ サン・・・
アレサ「たとえば プログラムを作製したとき
この命令文がどのように機能するかどうか・・・?
他の命令文に影響を与えるのではないか・・・?
わかりにくいようなときは
その命令文が
どのように
機能するかを判断できるよう
#ifdef マクロの定義名
命令文
#endif
#ifdef マクロの定義名と#endifで
はさんで記述します。
そうしておけば
#define マクロの定義名
を記述したり、しなかった場合のコンパイル結果を
比較して
その命令文がどのように働いているか?
他の命令文にどのような影響をあたえているか?
を確認することができます。」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます