关闭

宏与内联

标签: C++inline
211人阅读 评论(0) 收藏 举报
分类:

在C++里边推荐用内联函数来代替宏,这里面当然有它这样做的理由。下面就来总结一下宏与内联各自的优缺点。

刚学C时,你写的第一个宏可能是这样的:

#define MAX(a, b) a>b ? a : b


如果要调用这个宏函数,我们会这样:MAX(a, b); 我们都知道,编译器对宏只是做简的替换,所以编译预处理阶段结束后这条语句就会被替换为 a > b ? a : b ; ,这样,宏就完成了它的使命。这句代码是没有问题的,但是,当这样传参的时候:MAX(a, b) + c; ,这条语句会被替换为 a > b ? a : b + c; 问题就暴漏出来了。由于优先级而引发的边界问题。所以一半定义宏的时候,都会加上很多的括号,像下面这样:

#define MAX(a, b) ((a) > (b) ? (a) : (b); 

所以,宏有一个缺点就是书写麻烦。

另外,宏的参数是没有类型检测的,发生错误不容易定位错误源。

然后,宏在编译预处理阶段进行展开,不利于调试。

再比如,这样调用宏,MAX(a++, b); 展开后,变成了 a++ > b ? a++ : b ; 这个表达式中a变量是有可能被求值两次,所以可能得到错误的结果。

所以,当参数为带有副作用时,可能引发不易察觉的错误。

最后,当一个宏被多次调用时,展开后的代码可能会特别长。这也是一个缺点。

当然宏也有它的优点,那就是省去了调用函数的开销,提高了效率。


在C++中,我们有了一个关键字 inline ,用它修饰的函数,继承了宏的这种优点,摈除了宏一些的缺点。

inline的使用很简单,即在函数定义之前加关键字 inine即可(注意是定义前加)。

1. 内联函数书写简单;

2. 有类型检测

3. DEBUG版本不展开,方便调试,Realse版本展开,提高效率。

4. 而且不存在优先级不同和参数有副作用时引发的意外错误,因为它是个函数。

5. inline关键字对编译器来说只是个建议,具体是否作为内联函数,还要看编译器的决定(比如当函数中有循环或着递归时是不会作为内联函数的)。


inline 函数的定义对编译器而言必须是可见的,以便编译器能够在调用点内联展开该函数的代码。此时,仅有函数原型是不够的。所以一般把内联函数的定义放在头文件。

最后再说一点,在定义在类体内(花括号里边)的函数默认加了inline关键字。

1
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

面试---内联函数和宏定义的区别

用内联函数取代宏:1.内联函数在运行时可调试,而宏定义不可以; 2.编译器会对内联函数的参数类型做安全检查或自动类型转换(同普通函数),而宏定 义则不会; 3.内联函数可以访问类的成员变量,宏定义则...
  • will130
  • will130
  • 2015-09-24 15:58
  • 1228

C++中宏定义和内联函数区别

1. 宏代码不是函数
  • cgl1079743846
  • cgl1079743846
  • 2014-05-27 00:45
  • 2334

C++宏,普通函数,内联函数的运行速度以及三者的差异

下面论证一下:c/c++中 运行速度对比,宏>内联函数>普通函数 首先简单的代码验证下: #include "stdafx.h" #include #include #define ...
  • arxobject
  • arxobject
  • 2016-08-11 23:46
  • 642

C语言里面的内联函数(inline)与宏定义(#define)探讨

http://huxiongwei.spaces.eepw.com.cn/articles/article/item/85841 C语言里面的内联函数(inline)...
  • wangyin159
  • wangyin159
  • 2014-07-08 21:06
  • 945

内联函数和宏定义的总结

内联(inline)函数,不同于普通函数的是:普通函数是在编译是和调用者分别编译,运行到调用处时,将原函数的信息入栈,新函数执行。而内联函数,在编译时就直接把调用函数语句替换为整个内联函数代码(变量名...
  • coderwj
  • coderwj
  • 2016-03-30 23:18
  • 395

lua里实现类似宏定义,动态生成代码

其实就是用了  lua 的 loadstring 功能。 1.把需要动态生成的代码拼接成为一个字符串。 str 2. loadstring(str)   这个只是解析了代码,相当于一个f...
  • zhenmu
  • zhenmu
  • 2017-02-24 21:13
  • 931

c++的宏和内联函数

宏:就是使用一个字符串来代替一个表达式代码或函数调用代码;编译之前,预处理器会使用这个宏字符串所代表的表达式代码或函数调用代码来替换所有出现的宏字符串,这样的话,用宏表示的函数调用代码就不用另外开辟函...
  • duomoke
  • duomoke
  • 2014-07-22 09:37
  • 410

内联函数&宏定义

用内联取代宏:1.内联函数在运行时可调试,而宏定义不可以; 2.编译器会对内联函数的参数类型做安全检查或自动类型转换(同普通函数),而宏定义则不会;  3.内联函数可以访问类的成员变量,宏定义则不能;...
  • z794614061
  • z794614061
  • 2017-03-29 23:18
  • 121

宏和内联函数

含参数的宏与函数的区别 标签: 宏 2014-03-14 18:10 541人阅读 评论(0) 收藏 举报 本文章已收录于: ?         宏替换不占运行时间,只占编译时...
  • lipeng19930407
  • lipeng19930407
  • 2017-05-18 15:30
  • 64

内联函数与宏定义

用内联取代宏: 1.内联可调试; 2.可进行类型安全检查或自动类型转换; 3.可访问成员变量。 另外,定义在类声明中的成员函数自动转化为内联函数。 文章(一) ...
  • chenkent888
  • chenkent888
  • 2013-09-24 22:22
  • 487
    个人资料
    • 访问:86136次
    • 积分:2058
    • 等级:
    • 排名:千里之外
    • 原创:108篇
    • 转载:17篇
    • 译文:0篇
    • 评论:15条
    文章分类
    最新评论