目录
宏的优缺点
宏通常被应用于执行简单的运算,比如在两个数中找较大的一个:
#define MAX(x,y) ((x)>(y)?(x):(y))
以上的代码逻辑使用函数也可以完成:
int Max(int x, int y)
{
return x > y ? x : y;
}
为什么更偏向于用宏来完成呢?
宏的优点:
- 用于调用函数和从函数中返回值的汇编代码可能要比用宏来执行这个小型计算工作所需的时间更多,所以宏比函数在程序的规模和速度方面更胜一筹
- 函数的参数必须声明为特定的类型,所以函数只能在类型合适的表达式上使用,反之以上代码的宏可以适用于整型,长整型,浮点型来比较,宏和类型是无关的
宏的缺点:
- 每次使用宏的时候,一份宏定义的代码都将插入到程序中,除非宏比较短,否则可能大幅度增加程序的长度
- 宏是没有办法调试的,报错也只会在是只用宏的地方报错
- 因为宏和类型无关,所以宏是不够严谨的
- 使用宏要注意优先级的问题,否则程序结果会和预期的不同
宏和函数的区别
在代码长度上:每次使用宏的地方都会替换成宏定义的代码插入到程序中,而函数只需要声明一次
在执行速度上:宏更快,因为是直接替换,而函数在执行的时候存在函数的调用和返回,所以相对慢一些
在操作符优先级上:传递给宏的参数要结合代码的上下文来传递,否则容易出现优先级先后的问题,而函数直接传递变量即可,就算是带有副作用的变量,在函数传参时,都会计算后才传递
在参数类型上:宏的使用是和参数的类型无关的,只要是合法的参数,都可以使用宏来完成,而函数在声明时是用的什么类型,传递参数时只能传递对应的类型
在调试上:宏是不方便调试的,函数是可以逐语句调试的
在递归上:宏是不能递归的,函数可以递归
结论
函数和宏各有各的优缺点,要合理分配使用