一,内联函数的用法

  内联函数从源码层层看,有函数的结构,而在编译后,却不具备函数的性质。编译时,类似宏替换,使用函数体替换调用处的函数名。一般在代码中用inline修饰,但是能否形成内联函数,需要看编译器对该函数定义的具体处理。
  inline  Tablefunction(int I)    //是没有效果的,编译器只是把函数作为普通的函数申明,我们必须定义函数体。   Inline tablefunction(int I) {return I*I};    //这样我们才算定义了一个内联函数。我们可以把它作为一般的函数一样调用。但是执行速度确比一般函数的执行速度要快。

内联函数必须是和函数体申明在一起,才有效。

【注意】我们也可以将定义在类的外部的函数定义为内联函数,比如:

Class TableClass { private:   int i,j; public:   int add() { return i+j;};   inline int dec() { return i-j;}   int GetNum(); } inline int tableclass::GetNum() {   return i; }

   上面申明的三个函数都是内联函数。在C++中,在类的内部定义了函数体的函数,被默认为是内联函数。而不管你是否有inline关键字。

二,内联函数的应用(可以访问对象的私有成员)

内联函数在C++类中,应用最广的,应该是用来定义存取函数。我们定义的 类中一般会把数据成员定义成私有的或者保护的,这样,外界就不能直接读写我们类成员的数据了。对于私有或者保护成员的读写就必须使用成员接口函数来进行。如果我们把这些读写成员函数定义成内联函数的话,将会获得比较好的效率。

Class sample { private:   int nTest; public:   int readtest(){ return nTest;}   void settest(int i) {nTest=i;} }     当然,内联函数也有一定的局限性。就是函数中的执行代码不能太多了,如果,内联函数的函数体过大,一般的编译器会放弃内联方式,而采用普通的方式调用函数。这样,内联函数就和普通函数执行效率一样了。

三,内联函数注意事项

1,在内联函数内不允许用循环语句和开关语句。否则编译将该函数视同普通函数

2,递归函数(自己调用自己的函数)是不能被用来做内联函数的。

3,内联函数只适合于只有1~5行的小函数。对一个含有许多语句的大函数,函数调用和返回的开销相对来说微不足道,所以也没有必要用内联函数实现。 

4,内联函数的定义必须出现在内联函数第一次被调用之前。 

5,类结构中所有在类说明内部定义的函数是内联函数。

四,宏的定义

带参数的宏定义和不带参数的宏定义。具体是指用一个指定的标志符来进行简单的字符串替换或者进行阐述替换。

宏展开:在c程序编译时将宏名替换成字符串的过程

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

五,宏的局限性

  1,宏不能访问对象的私有成员。   2,宏的定义很容易产生二意性。

二义性例子:

  #define TABLE_MULTI(x) (x*x)   TABLE_MULTI(10)  //返回100,是正确的。

TABLE_MULTI(10+10)  //我们期望的结果是400,而宏的调用结果是(10+10*10+10),结果是120

这显然不是我们要得到的结果。避免这些错误的方法,一是给宏的参数都加上括号。

  #define TABLE_MULTI(x) ((x)*(x))

  这样可以确保不会出错,但是,即使使用了这种定义,这个宏依然有可能出错

TABLE_MULTI(a++)   //我们本意是希望得到(a+1)*(a+1)的结果,而宏的展开结果: (a++)*(a++)

如果a的值是4,我们得到的结果是4*4 = 16,a = 6。我们期望得到的是 5*5 = 25

六,内联函数和宏的区别

宏是由预处理器对宏进行替代,内联函数是编译器控制来实现的。

内联函数是真正的函数,只是在需要用到的时候,内联函数像宏一样的展开,所以取消了函数的参数压栈,减少了调用的开销。

你可以象调用函数一样来调用内联函数,而不必担心会产生于处理宏的一些问题。

转载于:https://www.cnblogs.com/JPAORM/archive/2012/05/15/2509993.html

【编程珠玑】内联函数和宏相关推荐

  1. 内联函数和宏定义函数的区别

    1.不同点: 内联函数是在编译时展开,而宏在预编译时展开:在编译的时候,内联函数直接被嵌入到目标代码中去,而宏只是一个简单的文本替换. 内联函数可以进行诸如类型安全检查.语句是否正确等编译功能,宏不具 ...

  2. 内联函数有什么优点?内联函数与宏定义的区别?

    内联函数的优点 内联函数比宏定义更加的安全,因为前者进行参数检查,而后者仅仅是简单地文本替换. 内联函数和宏定义的区别 宏定义是在预处理阶段进行的文本替换. 内联函数是在编译阶段进行的替换,优点是减少 ...

  3. 内联函数和宏定义的区别

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

  4. 内联函数和宏定义的相关区别

    内联函数和宏定义的区别 相同点 : 主要是为了避免被调用时的开销,是通过编译器来进行实现,而宏定义是通过预处理器进行替换,宏定义不检查函数参数,返回值等东西,只是展开,而相对来说,内联函数会进行检查参 ...

  5. 内联函数有什么优点?内联函数和宏定义的区别

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

  6. C++知识总结——内联函数与宏

    内联函数与宏 1.内联函数 1.1什么是内联函数 1.2选择使用内联函数 1.3内联函数优缺点 1.4内联函数与宏 1.5内联函数补充 1.内联函数 1.1什么是内联函数 ​​​  内联函数是c++的 ...

  7. 内联函数与宏函数的区别

    内联函数 概念 以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数压栈的开销,内联函数提升程序运行的效率 特性 inline是一种以空间换时间的做法,省去调用 ...

  8. C++起始(内联函数,宏的优缺点,const关键字,auto关键字(C++11)基于范围的for循环(C++11). 指针空值nullptr(C++11))

    内联函数 概念 以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数压栈的开销, 内联函数提升程序运行的效率 函数前增加inline关键字将其改成内联函数,在编 ...

  9. inline 内联函数详解 内联函数与宏定义的区别

    一.在C&C++中 一.inline 关键字用来定义一个类的内联函数,引入它的主要原因是用它替代C中表达式形式的宏定义. 表达式形式的宏定义一例: #define ExpressionName ...

最新文章

  1. Visual C++ 对话框增加菜单栏
  2. HDU Problem 1272 小希的迷宫 【并查集】
  3. 浅析Spring事务传播行为和隔离级别
  4. Asp.Net MVC 教程
  5. mysql将系统权限授予用户_mysql创建用户并授予权限
  6. numpy创建三维空数组_numpy数组的创建和属性转换
  7. c/c++ 变量作用域
  8. java颠倒字符串_Java经典实例:按字符颠倒字符串
  9. 李宏毅机器学习——无监督学习(三)
  10. (四)JSP语法详细介绍--脚本元素
  11. 排列组合公式/排列组合计算公式
  12. 张小龙是高球冠军,大前研一是物理学家:​为什么牛人在很多领域都是世界第一?...
  13. 基于Python的数据结构实验——顺序表与单链表建立与操作(附详细代码和注释)
  14. 哪种耳机对听力伤害小?骨传导耳机能保护听力吗?
  15. python抢红包脚本_Python自动抢视频红包,仅供学习!
  16. 力扣(1053.115)补9.13
  17. 你好,我是计算机组成原理(计算机组成原理1)
  18. 画多个矩形c语言,C# winform开发:Graphics、pictureBox同时画多个矩形
  19. 量子力学概论第一章---波函数
  20. 计算机320分调剂什么学校,398分被拒!2019的考研调剂是“神仙打架”!

热门文章

  1. 随机产生13个0~51不同的随机数 -思想(定义参考系)
  2. 关于魔方里的工具修改方法
  3. sql升序,降序的问题
  4. 一个表格,一部分允许编辑,有公式的单元格不允许编辑
  5. 《剑指 Offer I》刷题笔记 11 ~ 19 题
  6. 【Java从0到架构师】RocketMQ 使用 - 集成 SpringBoot
  7. 【Java从0到架构师】SSM 整合(XML、纯注解)
  8. 【Java 面向对象】基础、Java程序的内存划分、嵌套类(内部类、静态嵌套类)、局部类、接口的升级问题(默认方法、静态方法)、instanceof
  9. 启航~算法刷题第一天
  10. 如何修改linux的 系统语言