inline和宏define的区别

1.多使用const,inline少使用define
define
定义预编译时处理的宏,只是简单的字符串替换,无类型检查。
就是代码替换,在编译阶段进行简单的代码替换,大量用于宏定义开关,以及定义表达式和常量
关于定义表达式
例如:
#define ExpressionName(Var1,Var2) ((Var1)+(Var2))*((Var1)-(Var2))
  使用:
  int m = ExpressionName(5,6);
这种表达式定义的使用方式,其特点就是代码替换,使用的地方简介明了,因为是编译阶段替换,所以不会像普通函数调用那样涉及到参数的出栈入栈,效率就高;但这种使用方式也有问题,这种宏定义在形式上类似于一个函数,但在使用它时,仅仅只是做预处理器符号表中的简单替换,因此它不能进行参数有效性的检测,也就不能享受C++编译器严格类型检查的好处,另外它的返回值也不能被强制转换为可转换的合适的类型,这样,它的使用就存在着一系列的隐患和局限性。为此,在C++中,就引入了inline关键字,内联函数

**inline:**

inline关键字用来定义一个类的内联函数,引入它的主要原因是用它替代C中表达式形式的宏定义,编译阶段完成。
内联函数要做类型安全检查,inline是指嵌入代码,在调用函数的地方不是跳转,而是把代码直接写到那里去,对于短小的函数来说,inline函数可以得到一定效率的提升,和c时代的宏函数相比,inline函数更加安全可靠,这个是以增加空间的消耗为代价的。
inline 可以作为某个类的成员函数,当然就可以在其中使用所在类的保护成员及私有成员。
  在何时使用inline函数:
  首先,你可以使用inline函数完全取代表达式形式的宏定义。
  另外要注意,内联函数一般只会用在函数内容非常简单的时候,这是因为,内联函数的代码会在任何调用它的地方展开,如果函数太复杂,代码膨胀带来的恶果很可能会大于效率的提高带来的益处。内联函数最重要的使用地方是用于类的存取函数。

ps:定义内联函数只是给编译器一个建议,但是最后的决定权还是在于编译器,如果函数的逻辑比较复杂(有循环递归之类的),此时则会内联失败。根据google编程规范,内联函数一般在10行以下,而且逻辑简单。

关于宏定义
#define ASPECT_RATIO 1.653
编译器会永远也看不到ASPECT_RATIO 这个符号名,因为在源码进入编译器之前,它会被预处理程序去掉,于是ASPECT_RATIO 不会加入到符号列表中。如果涉及到这个常量的代码在编译时报错,就会很令人费解,因为报错信息指的是1.653,而不是ASPECT_RATIO。如果ASPECT_RATIO 不是在你自己写的头文件中定义的,你就会奇怪1.653 是从哪里来的,甚至会花时间跟踪下去。这个问题也会出现在符号调试器中,因为同样地,你所写的符号名不会出现在符号列表中。
解决这个问题的方案很简单:不用预处理宏,定义一个常量:
const double ASPECT_RATIO = 1.653;
这种方法很有效。但有两个特殊情况要注意。
首先,定义指针常量时会有点不同。因为常量定义一般是放在头文件中(许多源文件会包含它),除了指针所指的类型要定义成const 外,重要的是指针也经常要定义成const

宏可能导致的傻屌问题
例如计算两个变量的最大值
#define max(a,b) ((a) > (b) ? (a) : (b))
如果别人使表达式调用这个宏,就会出现以下情况;
int a = 5, b = 0;
max(++a, b); // a 的值增加了2 次
max(++a, b+10); // a 的值只增加了1 次。

如果使用内联函数(普通的函数家伙加上可预计的行为和类型安全)
inline int max(int a,int b)
{
return a>b?a:b;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值