C言語 #define マクロとは?

#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++ インライン関数