マクロを使って条件付きコンパイルを行うことができます。

アレサ「😊


以下の

プログラムでは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 マクロの定義名


を記述したり、しなかった場合のコンパイル結果を


比較して


その命令文がどのように働いているか?


他の命令文にどのような影響をあたえているか?


を確認することができます。」








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

作者を応援しよう!

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

応援したユーザー

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