C语言中宏定义和函数的区别

前言

在C语言中,对于一些常用或通用的代码段的封装可以有两种方式:函数宏定义

这篇博客就来带大家梳理一下对于这两种方式我们在使用时应该如何抉择,以及它们的区别和优缺点。

宏定义和函数的区别

  • 从程序的执行来看:

函数调用需要开辟和释放栈空间带来开销(存在函数调用压栈和返回的额外开销),不仅会降低代码效率,而且代码量也会大大增加。
宏定义只在编译前进行,不分配空间,不占运行时间。

总结:宏定义在代码规模和速度方面都比函数更胜一筹

  • 从参数的类型来看:

函数的参数必须声明为一种特定的数据类型,如果参数的类型不同,就需要使用不同的函数来解决。
宏定义的参数是无类型的,只要参数的操作是合法的,它可以用于任何参数类型。

总结:宏定义是类型无关的,较函数应用更为广泛

  • 从参数的副作用来看:

宏定义中对宏参数缺少必要的类型检查,宏的参数和返回值最好用()括起来,否则可能导致返回值和预期的结果不符,宏的参数如果传入自增自减型,则返回值也可能和预期不符。
函数则从根本上避免了这些问题的发生。

举个栗子:

#define MAX(a,b) ((a)>(b)?(a):(b))
x = 5;
y = 8;
z = MAX(x++,y++);
printf("x=%d y=%d z=%d,x,y,z);

输出结果:6 10 9

解析:

1.宏替换:MAX ( (x++) > (y++) ? (x++) : (y++) )
2.比大小:5 > 8 结果为假(此时后置++操作x=6,y=9),返回y,此时后置++操作y=10
3.输出:x=6,y=10,z为返回值(也就是y++之前的值)z=9

  • 从代码的长度来看:

宏定义使用时,代码的副本会插入程序中,除非宏非常短,否则使用宏会大幅度地增加程序的长度,并且宏是不方便调试且不能递归的。
函数代码则只会出现在一个地方,以后每次调用这个函数时,调用的都是那个地方的同一份代码

总结:宏定义的使用相较函数来说可能会大幅度增加程序的长度

从上面的四点分析:

函数和宏定义各有优缺点,这就要求我们根据具体情况具体分析,合理地对二者进行取舍

小结

综上所述,如何取舍这二者,还需要根据具体情况具体分析,千万不能够武断地做出判断。一般来说,应该用宏去替换小的、可重复的代码段,这样可以使程序运行速度更快。当任务比较复杂,需要多行代码才能实现时,或者要求程序越小越好时,就应该使用函数

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章