宏定义函数VS普通函数VS内联函数
宏定义函数VS普通函数
- 宏定义函数
-
要点:变量都用括号括起来,防止出错,结尾不需要;。在实际编程中,不推荐把复杂的函数使用宏,不容易调试。多行用\
-
例子:
单行:
#define MAX(a, b) ((a) > (b) ? (a):(b))
多行:#define MALLOC(n, type) \ ((type *) malloc((n)* sizeof(type))
对于第一个函数,如果用普通函数,该怎样写?
int max(int a, int b) { return (a > b ? a : b); }
很显然,我们不会选择用函数来完成这个任务,原因有两个:
- 首先,函数调用会带来额外的开销,它需要开辟一片栈空间,记录返回地址,将形参压栈,从函数返回还要释放堆栈。这种开销会降低代码效率,而使用宏定义则在代码速度方面比函数更胜一筹;
- 其次,函数的参数必须被声明为一种特定的类型,所以它只能在类型合适的表达式上使用,我们如果要比较两个浮点型的大小,就不得不再写一个专门针对浮点型的比较函数。反之,上面的那个宏定义可以用于整形、长整形、单浮点型、双浮点型以及其他任何可以用“>”操作符比较值大小的类型,也就是说,宏是与类型无关的。
- 和使用函数相比,使用宏的不利之处在于每次使用宏时,一份宏定义代码