一:宏扩展出错
#define FUN(x) 1 + x * x int main() { printf("%d\n", 3*FUN(1)); return 0; }
这里宏扩展成了 31+11。并不是3*(1+1)。
为了避免这种出错,尽量在宏这里使用括号
#define FUN(x) (1 + x * x)
二:宏内部扩展出错
#define FUN(x) (x*x) int main() { printf("%d\n", FUN(1+1)); return 0; }
这里宏内部扩展成了(1+11+1)。并不是((1+1)(1+1))
为了避免这种错误,尽量在宏的变量处添加括号
#define FUN(x) ((x)*(x))
三:宏变量自加/自减出错
#define FUN(x) (x*x) int main() { int i=2; printf("%d\n", FUN(i++)); return 0; }
这里输出是6,也就是2*3,因为i自加了为了避免这种错误,自加/自减不要在宏扩展里面用。
四:宏函数扩展错误
#define FUN(x) x=10;x+=1 int main() { int i=2; if (i == 1) FUN(i); printf("%d\n", i); return 0; }
这里因为if没有缺省括号,导致宏扩展后,x+=1在if外面了。所以输出是3而不是2
为了避免这种错误,可以使用do while写法如下
#define FUN(x) do{x=10;x+=1;}while(0)