×

C ---------- 使用#define定义一个带参数的宏,注意事项

zxjy辉 zxjy辉 发表于2023-12-11 14:39:51 浏览1774 评论0

抢沙发发表评论

应避免使用使用宏定义 带参数的表达式,因为会导致多次求值,导致结果和预期不符


例如 #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;
}

#好好学习!

群贤毕至

访客