应避免使用使用宏定义 带参数的表达式,因为会导致多次求值,导致结果和预期不符
例如 #define max(a,b) (a)>(b)?a:b
上述的这个宏定义带参表达式,在使用带有++,--方式时,就会导致重复求值,该表达式,一共进行两次求值,一次是在判断 a是否大于b,另一次则是,输出max(a,b)结果的时候
举个例子
int a=0,i=0; int b[2]; b[0] = 1; b[1]= 2; max(a,b[i++]); // 这个例子,就会扩展为:(a)>(b[i++])?(a):(b[i++]);
在这个式子中,结果和预期就不相同,原本正常情况下:a等于0,b[0]等于1,那么这个表达式的返回值应该为1,而事实上,返回值确实2,应为在在输出结果的时候,b的下标又进行了一次++操作
还有的也许是地址的自加或则自减,等等,都需要注意,多次求值,都会导致结果和预期不符
所以说,在使用带有自加,自减操作的,一定要将表达式实现为函数,而不是宏定义
u8 max(u8 a, u8 b)
{
if(a>b){
return a;
}
return b;
}#好好学习!