1.在C/C++ 编程中,宏中所有的实参加上小括号,否则调用该宏时可能产生未知的结果;但是即使将宏中所有的实参加上了小括号,也会有些不可思议的事情:
#define call_with_max(a,b) f((a) > (b) ? (a) : (b))
int a = 5;
int b = 0;
call_with_max( ++a , b);
call_with_max( ++a , b + 10);
c++在预编译阶段将调用宏的位置直接替换成定义的字符串,如上面的代码中定义的宏 ‘call_with_max(a,b)’,进行预处理时将
call_with_max( ++a , b)替换为 f((++a)>(b)?(++a):(b)); -- a 被累加了2次
call_with_max( ++a , b + 10) 替换为 f((++a)>(b+10)?(++a):(b+10)); -- a被累加1次