スポンサーリンク

オブジェクト形式のマクロ関数形式(#define)の説明

define 文字列を任意のマクロ名に置き換える

【 #define 】を使うことにより文字列を任意のマクロ名に置き換えることが出来ます。

例:【 #define max 100 】
【 max 】と言うマクロ名をコンパイル前処理段階で【 100 】と言う文字列に置き換えることが可能になります。
使い方サンプルを見ていただくと判りやすいと思います。

#include <stdio.h>
#define max 100
int main(void)
{
int i;
i=max;
printf(“%d”,i);
return 0;
}

解説、マクロ名 【 max 】に【 100 】をと言う文字列を置き換えたサンプルです。
変数【 i 】に【 max 】を代入し、確認の為出力させています。

実行結果、置き換えられた値が出力されております。

上記の場合わざわざマクロを使うほどの物ではないのですが、以下の様に記述すれば
プログラムの内容がわかりやすくなるとの事です。

#include <stdio.h>
#define max 100
int main(void)
{
int i;
for(i=0; i<=max; i=i+10){
printf(“%d\n”,i);
}
return 0;
}

実行結果

オブジェクト形式マクロ

一つの名前で複数の命令を実行するように記述可能なことをマクロと言い、置き換えにはオブジェクト形式マクロと関数形式マクロがあります。

オブジェクト形式マクロ例:【 #define max 100 】(上記サンプルにて説明済み)
関数形式マクロ例:【 #define dta(a,b) ((a)+(b))】
関数形式マクロ例2:【 #define pt() 】

一つの名前で複数の命令を実行するように記述可能なことをマクロと言い、置き換えにはオブジェクト形式マクロと関数形式マクロがあります。

関数形式マクロサンプルソース

#include <stdio.h>
#define dta(a,b) ((a)+(b))
#define pri(dt) printf(“%d\n”,dt)int main(void)
{
int cc;cc=dta(50,50);pri(cc);return 0;
}

解説、関数形式マクロの書式【 #define 任意のマクロ名(引数) 引数を使った置換文字列 】
以下の様に関数式マクロをそれぞれ用意し、メイン関数の中に、変数名【 cc 】に【 dta 】マクロにて【 cc=50+50 】に置き換えられた値を代入し、【 pri 】マクロにて【 printf(“%d\n”,cc) 】出力に置き換えております。

実行結果

安全に記述すると言う意味で「例((a)+(b))」カッコを多様

関数形式マクロは、期待と異なる結果を出力する事があり、安全に記述すると言う意味で例((a)+(b))カッコを多様
関数形式【 a+b 】

カッコ無しサンプルソース

#include <stdio.h>
#define dta(a,b) a+b
#define pri(dt) printf(“%d\n”,dt)int main(void)
{
int cc;
cc=dta(2,4);
pri(cc);cc=dta(2,4) * dta(6,8);
pri(cc);return 0;
}

解説、【 #define dta(a,b) a+b】とカッコなしの場合最初の処理は特に問題は出ないのですが、二行目の処理に付いては、2+4*6+8と処理される為、取得したい値と結果が異なる場合が発生します。その為安全性を確保する為カッコを多用します。この次のサンプルをご覧下さい。

実行結果

カッコを多用して安全性を確保するサンプルソース

#include <stdio.h>
#define dta(a,b) ((a)+(b))
#define pri(dt) printf(“%d\n”,dt)int main(void)
{
int cc;
cc=dta(2,4);
pri(cc);cc=dta(2,4) * dta(6,8);
pri(cc);

return 0;
}

解説

実行結果

同じマクロで異なるデータ型の引数を使用する説明

関数形式マクロは、同じマクロで異なるデータ型の引数を使用出来ます。
例:整数・実数にて引数を用いる事が可能です。

#include <stdio.h>
#define dta(a,b) ((a)+(b))int main(void)
{
int cc;
double dd;
cc=dta(2,4);
printf(“%d\n”,cc);

dd=dta(1.2345,2.4681);
printf(“%f”,dd);

return 0;
}

解説

実行結果

コメント

タイトルとURLをコピーしました