关于#define宏定义值得注意的两点

        今天在调试程序时,出现了两个关于#define宏定义的问题,虽然很简单,但是很值得注意以下。

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);


你可能感兴趣的:(编程,c,fun)