区别
测试用例:
宏函数:#define MAX(a,b) ((a)>(b)?(a):(b))
普通函数:MAX(a,b) {return a>b?a:b}
1.宏做的是简单的字符串的替换,而函数是参数的传递,参数是有数据类型的。
2.宏的参数替换是直接替换的,不经任何计算,而函数调用时将形参的值传给形参。
3.宏在编译之前进行(先用宏体替换宏名,再进行编译),而函数是在编译之后执行时才调用的。
4.宏的参数是不占内存空间的,因为只做字符串的替换,而函数调用时参数之间的传递,所以占用内存。
5.函数调用需要空间开销,因为在函数调用时它既要保存现场又要跳转到另一个函数调用中去执行,然后还要返回现场,但宏函数中就不存在。
优缺点
1.使用宏函数定义编译生成的目标文件比普通函数生成的目标文件大。
2.宏函数会导致代码的执行效率降低。
测试用例:
int a[]={9,3,5,2,1,0,7,6,4};
int max(n)
{
return n==0?a[0]:MAX(a[n],max(n-1));
}
int main()
{
max(9);
return 0;
}
宏展开为(a[n]>max(n-1)?a[n]:max(n-1)),其中max(n-1)被调用了两遍,这样依次递归下去,时间复杂度会很高。
3.主要小心使用还是会显著的提高代码的执行效率。