#define MAX(a,b) ((a)>(b)?(a):(b))
int MAX1(int a,int b)
{
return a>b?a:b;
}
1)宏定义函数没有参数类型也不做类型检查,预编译阶段直接进行宏替换。所以对上面的宏定义函数他可以比较不同类型的数据大小,而普通函数则只能比较形参类型的大小。
2)宏定义函数时一定要注意括号的存在和匹配,有时会因为 括号的不存在就会导致函数在计算的时候出现优先级错误的现象继而导致整个程序出错。
3)调用宏定义函数和普通函数生成的指令不同。
普通函数每次编译都要生成指令并且在每次调用时都要生成传参指令和call指令。而宏定义函数编译时则不生成任何指令,
但在调用时和函数体一样都会生成传参指令和call指令以及其他的一些指令, 所以在使用宏定义函数时编译生成的目标文件
过大。
4)宏定义函数有时会导致代码的执行效率变低,例如:
#include <iostream>
using namespace std;
int a[6] = {32,12,45,17,65,48};
#define max(n) (a[n]>max(n-1)?a[n]:max(n-1))
int max1(int n)
{
return n==0?a[0]:max(a[n]>max(n-1)?a[n]:max(n-1));
}
int main()
{
cout<<max(4)<<endl;
cout<<max1(4)<<endl;
}
在这种情况下,如果我们调用的是普通函数则只需通过递归就可以得到整形数组中最大的那个数并且时间复杂度为O(n),
但如果调用的是宏定义函数就会发现max(n-1)在调用一次宏定义函数max(n)时会被算两遍。现在的数据量还不是很大也许
你会觉得不就是两遍这有什么大不了的,但是当我们的数据达到一个非常大的数据量的时候你应该就会明白宏定义函数
与普通函数的时间复杂度的差异到底有多大了。