1、自定义了一个宏,本意是用来求解数a的平方,可是在调用时出现了负值,如下
#define SQUARE(a) (a*a) POINT pt1, pt2; int length = SQUARE(pt1.x-pt2.x) + SQUARE(pt1.y-pt2.y);
发现原来是宏定义时出错了,#define定义的宏只是一种替换,于是上述length实际是
length = pt1.x-pt2.x*pt1.x-pt2.x + pt1.y-pt2.y*pt1.y-pt2.y
这就是出现负值的原因。其实这个错误很低级,只是编程时经常忘了,或者说没有规范书写。这也导致我多花了十多分钟来调试找原因。
应该改为
#define SQUARE(a) ((a)*(a))这样就好了。
2、在用max(a,b)宏时,我使用了
max(fun1(),fun2());结果发现fun1被调用了两次,开始很诧异,后来发现其实确实是这样的。以下为max定义
#define max(a,b) ((a)>(b)?(a):(b))开始时要调用fun1和fun2用于比较a和b的大小,如果a大,则会再调用一次fun1,将其值赋给变量。因此,调用此类宏时,最好先将函数值算出来,再赋值调用,避免函数的两次计算。
int a = fun1(); int b = fun2(); int c = max(a,b);