宏定義中容易引起許多運算優先級的問題,需要用括號加以約束
例如
#define abs(x) x>0?x:-x
abs(a-b);
abs(a)+1;
帶入展開後,結果如下:
a-b>0?a-b:-a-b;
a>0?a:-a+1;
以上兩個式子的運算優先級完全混亂。
因此需要在宏定義中將每個參數都用括號括起來+整個結果表達式也用括號括起來,如下:
#define abs(x) (((x)>0)?(x):-(x))
另外一個易錯的地方是,在宏調用的時候有++ 或者--運算
例如,
#define max(a,b) (((a)>(b))?(a):(b))
max(a,b++);
將宏定義帶入展開後
(((a)>(b++))?(a):(b++));
可以發現在上述表達式中b自增了兩次