define和内联函数

18 篇文章 0 订阅

宏定义
宏替换是按定义替换成相应的常量表达式或字符闯,不会增加任何其他字符(如圆括号()等)
#define NUM 5+7
p = NUM*NUM将会被替换成p = 5+7*5+7
所以宏定义仅仅是文本替换。

宏定义与内联函数

首先,为什么需要使用宏定义?
函数调用需要使用函数栈,需要一定的时间和空间的开销,影响其效率。
宏定义在预编译的地方将代码展开,不需要额外的时间和空间开销。

宏的缺点?
1、不能访问对象的私有成员
2、很容易产生二义性。
3、无法单步调试
4、没有类型检查

内联函数
编译期间,将内联函数的代码插入调用者代码处的函数,避免被调用的开销来提高执行效率。也就是说
内联函数是真正的函数,只是在需要用到的时候,内联函数像宏一样展开,所以取消了函数的参数压栈,减少了调用的开销。

内联函数的局限
如果内联函数中执行的代码太多,一般编译器会放弃内联的方式,而采用普通的方式,这样就和普通的函数执行效率相同了。

wiki上还有其他一些问题

  • 宏调用并不执行类型检查,甚至连正常参数也不检查,但是函数调用却要检查。
  • C语言的宏使用的是文本替换,可能导致无法预料的后果,因为需要重新计算参数和操作顺序。
  • 在宏中的编译错误很难发现,因为它们引用的是扩展的代码,而不是程序员键入的。
  • 许多结构体使用宏或者使用不同的语法来表达很难理解。内联函数使用与普通函数相同的语言,可以随意的内联和不内联。
  • 内联代码的调试信息通常比扩展的宏代码更有用。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值