带参数的宏也被称为”函数宏”. 利用宏可以提高代码的运行效率: 子程序的调用需要压栈出栈, 这一过程如果过于频繁会耗费掉大量的CPU运算资源. 所以一些代码量小但运行频繁的代码如果采用带参数宏来实现会提高代码的运行效率.
经常看到别人的代码中会出现简单的宏函数,代码看起来简洁又方便,今天我也尝试了一下,但在我使用宏函数的过程中有一个问题突然闪现在我的脑海:
交换两个变量的宏:
#define SWAP(a,b) {int t;t=a;a=b;b=t;}
但是如果这个宏写成函数的话就是这个样子:
void Swap(int a,int b)
{
int t;
t=a;
a=b;
b=t;
}
仔细一看这个函数,这不是我刚学C语言时犯的错误么,看起来能交换两个变量的值,其实不然,函数的实参和形参是值传递,在调用函数的时候内存开辟了一段新空间,函数中的变量a,b,t都在刚刚开辟的内存里,实参变量把值赋给形参之后,形参和实参再也没有联系了,所以即便在函数内部交换了a和b的值,和实参a和b也没有一点关系,实参的a和b并没有交换。
诶,那为什么宏函数就可以?
看来还是我对宏的理解并不深刻,C语言深度剖析有关宏的介绍:
从本行宏定义开始,以后的代码就就都认识这个宏了;也可以把任何东西定义成宏。因为编译器会在预编译的时候用真身替换替身,而在我们的代码里面却又用常常用替身来帮忙。
注意这一点:宏函数被调用时是以实参代换形参。而不是“值传送”。
宏定义又称为宏代换,关键就在代换上,在预处理时宏就已经做了代换了,那么做交换的就是实参本身了。
参考:
C中的预编译宏定义:
http://www.cnblogs.com/developer-ios/p/4855503.html
函数式宏定义与普通函数:
http://www.cnblogs.com/dong008259/archive/2011/12/27/2302625.html