#define は文字列の置換ができますが、
簡易関数のように使うこともできます。
#define menseki(x, y) ((x) * (y) / 2) // マクロの定義
void main(void) {
int ans = 0;
ans = menseki(5, 10); // マクロの使用
printf("面積=%dです\n", ans);
}
このようなマクロを定義すると、
ans = menseki(5, 10); のところが ans = ((5) * (10) / 2);
に置き換わり、コンパイルされます。
簡単な機能の関数をマクロとして使えば作業効率が上がりますが、
注意しなければならない事もあります。
上記の例では、厳重にカッコをつけてありますが、これには意味があります。
次の例を見てみましょう。
うまくいかない例1
#define macro1(x, y) x * y // マクロの定義
i = macro1(a+5, b+10); // マクロの使用
置換後:a+5 * b+10;
置換後、5 * b が先に計算されてしまってうまくいきません。
うまくいかない例2
#define macro2(x, y) (x) + (y) // マクロの定義
i = macro2(4, 5) / 10; // マクロの使用
置換後:(a) + (b) / (10);
置換後、b / 100 が先に計算されてしまってうまくいきません。
うまくいかない例3
#define macro3(x, y) ((x) * (y)) // マクロの定義
i = macro3(x++); // マクロの使用
置換後:((x++) * (x++));
置換後、x++ が2回行われてしまい、うまくいきません。
このように、やれるだけのカッコをつけても
うまくいかない場合があるので、
プログラマが注意しなければなりません。
■参考ページ
C++ インライン関数