/* マクロの副作用 */ #include #define MUL(x, y) (x * y) #define SQUARE(x) ((x) * (x)) int main() { int a = 2; int b = 3; int c = 4; int d = 5; int x; x = MUL(a + b, c + d); printf("%d\n", x); /* ↑ * #define マクロは、単純に文の置き換えをするだけ。 * * この場合、 * (a + b * c + d) * に展開される。 * (a + b) * (c + d) → 5 * 9 → 45 ではなく、 * (a + b * c + d) → 2 * 7 * 5 → 70 になる。 * * MUL の定義を * #define MUL(x, y) ((x) * (y)) * にすればこの問題は起きない。 */ x = SQUARE(++a); printf("%d\n", x); /* ↑ * これも、 * ((++a) * (++a)) * に展開される。 * (++a → 3) の2乗 → 9 ではなく、 * (++a, ++a → 4) の2乗 → 16 になる。 * * マクロとインクリメントは相性が悪いので、一緒に使わないように。 * 面倒でも、 * ++a; * x = SQUARE(a); * というように2つに分けて書く。 */ return 0; } /* 最近では、マクロを使うこと自体、非推奨。 C++ や C99 にはインライン関数という物があるので、それを使うように。 C89 でも、標準ではないものの、たいていのコンパイラには _inline キーワードがある。 */