C++入门应该注意的问题(内联函数和C的宏)

本文探讨了C++中的内联函数与C语言宏的关联和区别。C语言宏在预处理阶段进行文本替换,可能导致优先级问题,而内联函数在编译时插入代码,提高了效率并解决了宏的一些缺点。内联函数提供类型安全检查,但编译器可能忽略内联请求。文章建议尽量使用内联、const、enum替代#define,并列举了内联函数的适用场景和注意事项。
摘要由CSDN通过智能技术生成

C++中的内联函数和C的宏关联非常强

首先来回顾C语言中的宏,

编写一些简单的宏函数实际上也是某些公司喜欢考的题

首先我们来写一个ADD两个变量的宏函数:

宏函数的第一点就是 :预处理的时候能不能替换,比如这个ADD函数

上图中替换的时候要能保证原函数的作用不变,最主要的就是运算优先级。

所以正确的写法如下:

#define (a,b) ((a)+(b))

下面总结一下宏

宏的优点:代码的可维护性强、宏函数提高效率,减少了栈帧的建立

宏的缺点:可读性差,没有类型安全检查(上面的参数是没有给类型的),不方便调试(被替换掉了)

内联函数

接下来说C++中的内联函数:

如果一个函数是内联的,那么在编译时,编译器会把该函数的代码副本放置在每个调用该函数的地方。对内联函数进行任何修改,都需要重新编译函数的所有客户端,因为编译器需要重新更换一次所有的代码,否则将会继续使用旧的函数。如果想把一个函数定义为内联函数,则需要在函数名前面放置关键字inline,在调用函数之前需要对函数进行定义。

这里内联函数就是对宏的改进:

inline int Add(int a  int b)
{
    return a+b;
}

 

上面这个是在配置后的debug环境下汇编代码,可以清楚的看到在做加法的时候,没有call指令。

 在兼具宏函数优点的情况下,这里其实几乎解决了宏函数的缺点

所以侯捷老师说 尽量使用const、enum、inline去替代#define

最后来介绍一下内联函数的特性:

inline是一种以空间换时间的做法,省去调用函数额开销。所以代码很长或者有循环/递归的函数不适宜使用作为内联函数。
inline对于编译器而言只是一个建议,编译器会自动优化,如果定义为inline的函数体内有循环/递归等,编译器优化时会忽略掉内联。
inline不建议声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址了,链接就会找不到
 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

何以过春秋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值