面试归来3--宏和内联函数的区别

本文探讨了宏和内联函数在程序中的作用及其优缺点。宏通过简单的文本替换节省函数调用开销,但存在访问限制和二义性问题。内联函数则在保留函数调用便利性的同时,避免了宏的部分缺陷。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 函数在调用时 程序要跳转到被调用函数所在的那个内存地址空间,进而执行被调用函数的代码,待执行完被调用函数后,程序再回到跳转之前的位置继续执行。这就需要在程序跳转之前保存现场并记忆执行的地址,转回后恢复现场,按原来保存的地址继续执行。
这样就会有一定时间和空间的开销影响程序效率。
什么是宏?
1 预处理命令:在源程序中以#开头的命令,如 #include # define
  预处理部分: 在源文件中,在函数之外,源程序之前的预处理命令。
  预处理:在对源程序的编译的第一次扫描(词法扫描和语法分析)前做的工作。
  预处理由预处理程序完成。在源程序编译之前,由系统自动调用预处理程序对预处理部分进行预处理,而后编译源程序。
2 宏:用标示符去表示一个字符串。被定义为宏的标示符 称为 宏名
  宏展开:在源程序编译预处理中,对程序中所有出现的“宏名”都用宏定义中的字符串去代换。
  从上面可以看出 使用宏的形式 可以省去函数跳转 节省时间和空间的消耗 提高程序效率。
 
 宏的缺点:
 (1)无法访问对象私有成员
 (2)宏的定义 很容易出现 二义性
 我们举个例子:
#define square(x) (x*x)
我们用一个数字去调用它,square(5),这样看上去没有什么错误,结果返回25,是正确的,但是如果我们用squre (5+5)去调用的话,我们期望的结果是100,而宏的调用结果是(5+5*5+5),结果是35,这显然不是我们要得到的结果。避免这些错误的方法,一是给宏的参数都加上括号。
#define square(x) ((x)*(x))

解决办法:内联函数
内联函数 是自身代码被插入到调用者函数代码处的函数。同宏一样 内联避免被调用的开销来提高执行效率。
和宏的区别:宏 由预处理器对宏进行替换 而 内联函数有编译器的控制来实现。
你可以像调用函数一样调用内联函数,同时没有二义性的担忧。
内联函数的定义:
inline void f(int i,char c)
{
}
注意:内联函数必须和函数体声明在一起才有效。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值