c++内联函数与c宏

在c中我们可以使用带参数的宏来进行类似函数的实现:使用宏不需要检查变量类型,在某些情况下对于实现简单的函数比较方便;使用带参数的宏可以避免由于函数调用带来的额外开销。
但要注意带参数的宏和函数的区别:宏在编译之前就被处理掉了,不参与编译,不会占用内存,其本质仅仅是字符串的替换。而函数会被编译,会给它分配内存,每次调用函数,就是执行这块内存中的代码。
所以使用宏可能会发生一些难以察觉的副作用。

c++中则提供了更好的选择:使用内联函数
使用内联函数时,通常的做法是省略函数原型,将整个定义放在本应提供原型的地方,并在函数定义前加上关键字inline
下面是一段示例:

#include<iostream>
#define SQUARE(X) ((X)*(X))
inline int square(int x){return x*x;}

int main(){
 using namespace std;
 int c = 1;
 cout<<"宏 SQUARE(c++)= "<<SQUARE(c++)
 <<"  now c="<<c<<endl;
 c = 1;
 cout<<"内联 square(c++)= "<<square(c++)
 <<"  now c="<<c;
} 

注意输出结果:
在这里插入图片描述你会发现:c初值同样是1,但两者运算结果不一样。为什么会这样呢?
其实,在内联函数中,square()函数确实是按我们想象的那样,先计算了c*c=1,再给c值加一变为2。但在宏中,c被递增了两次。宏SQUARE()先将一个X替换成了c(值为1),然后给c值加一,再替换另一个X为c(值为2),所以实际计算值为c(c+1)=2。等这些计算完成后又给c值加了1,所以c值现在为3。

使用宏时可能遇到不想出现的结果,
所以,c++中内联函数是比宏更好的选择。
以下内容节选自c++ primer plus 6th p255:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值