マクロは単なる文字列の置換であり、完了プロセスの前に発生するためです。コンパイラは、マクロ変数とその値を確認する機会がありません。例: マクロが次のように定義されている場合
#define BAD_SQUARE(x) x * x
そしてこのように呼ばれました
BAD_SQUARE(2+1)
コンパイラはこれを確認します
2 + 1 * 2 + 1
その結果、おそらく、予期しない結果が発生します
5
この動作を修正するには、次のように常にマクロ変数を括弧で囲む必要があります。
#define GOOD_SQUARE(x) (x) * (x)
このマクロが呼び出されると、たとえば、このように
GOOD_SQUARE(2+1)
コンパイラはこれを確認します
(2 + 1) * (2 + 1)
その結果、
9
さらに、ポイントをさらに説明するための完全な例を次に示します
#include <stdio.h>
#define BAD_SQUARE(x) x * x
// In macros alsways srround the variables with parenthesis
#define GOOD_SQUARE(x) (x) * (x)
int main(int argc, char const *argv[])
{
printf("BAD_SQUARE(2) = : %d \n", BAD_SQUARE(2) );
printf("GOOD_SQUARE(2) = : %d \n", GOOD_SQUARE(2) );
printf("BAD_SQUARE(2+1) = : %d ; because the macro will be \
subsituted as 2 + 1 * 2 + 1 \n", BAD_SQUARE(2+1) );
printf("GOOD_SQUARE(2+1) = : %d ; because the macro will be \
subsituted as (2 + 1) * (2 + 1) \n", GOOD_SQUARE(2+1) );
return 0;
}