我们再举一个例子,#define MUL(A,B) A*B。而在使用的时候,这样的调用:int a=1,b=2,c=3,d=0;d=MUL(a+b,c),经过编译时候展开,就变成了d=a+b*c,而不是我们所希望的d=(a+b)*c。其解决办法也很简单,就是给每个分量,都加上括号,就可以避免此类问题。即,在宏定义的时候,如此定义:#define MUL(A,B) ((A)*(B))。不过有些时候,加了括号,也没有办法避免这些问题。
但是使用#define来定义函数,确实可以减少系统开销,提高运行效率。为什么会这样呢?因为在C语言中,发生函数调用的时候,需要保留调用函数的现场,子函数执行完毕以后还有回复函数调用的现场,这都需要一定的时间。如果子函数执行的任务比较多,这点时间是可以忽略的,但是如果子函数的功能比较少,比如只是一个加法的操作,那这部分转换操作的开销就太大了。使用带参数的宏定义就不会出现这样的问题,因为他是在预处理阶段就进行了宏展开,在执行的时候不需要进行转换,即在当地执行。宏定义可以完成简单的操作,但是复杂的操作还是要借助函数调用来实现。另外,宏定义的代码如果比较长,预编译的时候,所有引用的部分的代码都需要展开,那么目标代码的空间就会相对较大。所以,我们还是要根据实际情况来决定是否使用宏定义。
|