C++宏函数和内联函数

1. 宏常量&宏函数

1.1 定义

// a. 定义一个宏常量
#define MAX 1024 // 宏常量  MAX称为符号常量// b. 定义一个宏函数
// 宏函数:宏函数就是使用宏定义定义出来的函数,并不是真正意义上的函数。
#define GETSUM(x, y) ((x) + (y)) // 宏函数

1.2 使用宏函数的注意事项

  • 要保证运算的完整性;
  • 宏函数的使用场景:频繁调用和短小的函数,封装成宏函数;
  • 使用宏函数的优点:以空间换时间;

2. 内联函数

2.1 定义

​ 内联函数,C++独有;

​ 内联函数本质也是一个普通的函数,解决了宏函数的缺陷;

// 内联函数在函数声明和函数定义上都要加上inline关键字。
inline int fun();
inline int fun()
{cout << "fun..." << endl;
}

2.2 某些情况编译器不会做内联编译

  • 不能存在任何形式的循环语句
  • 不能存在过多的条件判断语句
  • 函数体不能过于庞大
  • 不能对函数进行取地址的操作

3. 补充

3.1 宏定义和函数的区别

  1. 宏在预处理阶段完成替换,之后被替换的文本参与编译,相当于直接插入了代码,运行时不存在函数调用,执行起来更快;函数调用在运行时需要跳转到具体调用函数;
  2. 宏定义属于在结构中插入代码,没有返回值;函数调用具有返回值;
  3. 宏定义参数没有类型,不进行类型检查;函数参数具有类型,需要检查类型;
  4. 宏定义不要在最后加分号;

3.2 宏定义和typedef的区别

  1. 宏主要用于定义常量及书写复杂的内容;typedef主要用于定义类型别名;
  2. 宏替换发生在预编译阶段之前,属于文本插入替换;typedef是编译的一部分;
  3. 宏不检查类型;typedef会检查数据类型;
  4. 宏不是语句,不在在最后加分号;typedef是语句,要加分号标识结束;
  5. 注意对指针的操作,typedef char * p_char和#define p_char char *区别巨大;

3.3 宏函数和内联函数的区别

  1. 在使用时,宏只做简单字符串替换(编译前)。而内联函数可以进行参数类型检查(编译时),且具有返回值;
  2. 内联函数在编译时直接将函数代码嵌入到目标代码中,省去函数调用的开销来提高执行效率,并且进行参数类型检查,具有返回值,可以实现重载;
  3. 宏定义时要注意书写(参数要括起来)否则容易出现歧义(保证运算的完整性),内联函数不会产生歧义;
  4. 内联函数有类型检测、语法判断等功能,而宏没有;

3.4 define宏定义和const的区别

  1. 处理阶段:define是在编译的预处理阶段起作用,而const是在编译、运行的时候起作用;
  2. 安全性:
    • define只做替换,不做类型检查和计算,也不求解,容易产生错误,一般最好加上一个大括号包含住全部的内容,要不然很容易出错;
    • const常量有数据类型,编译器可以对其进行类型安全检查;
  3. 内存占用
    • define只是将宏名称进行替换,在内存中会产生多分相同的备份。const在程序运行中只有一份备份,且可以执行常量折叠,能将复杂的的表达式计算出结果放入常量表
    • 宏定义的数据没有分配内存空间,只是插入替换掉;const定义的变量只是值不能改变,但要分配内存空间。

C++宏函数和内联函数相关推荐

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

    宏定义和内联函数都是为了使得程序减少函数的调用而花费的开销,提高了执行效率 宏定义只是作简单的文本替换,而内联函数则是在调用出展开 宏定义在预处理时作替换,而内联函数在编译时展开 内联函数会做类型.语 ...

  2. 宏定义,宏函数和内联函数

    宏定义,宏函数和内联函数 宏是什么: 简单宏替换出现的问题: 带参数的宏定义(宏函数): 宏的优点: 宏的缺陷,内联函数的引入 内联函数(空间换时间) 宏是什么: 宏(#define)命令是C语言中的 ...

  3. 【C/C++】宏函数与内联函数的区别

    [C/C++]宏函数与内联函数的区别 文章目录 [C/C++]宏函数与内联函数的区别 一.概念 二.特性 三.优缺点 3.1 内联函数的优缺点? 3.2 宏的优缺点? 四.笔试题 4.1 为什么要是用 ...

  4. 对普通函数、宏函数、内联函数的作用机制的探索

    这次我们来分析的是C/C++程序员经常遇到的问题,如何在普通函数.宏函数.内联函数之间做取舍,其实它们三者之间并没有什么绝对的你好我差的说法,只要掌握了三者的作用机制的话,结合实际情况一般都能做出正确 ...

  5. mysql 内联函数_内联函数 - freeboy小亮 - 博客园

    (1)什么是内联函数? 内联函数是指那些定义在类体内的成员函数,即该函数的函数体放在类体内. (2)为什么要引入内联函数? 当然,引入内联函数的主要目的是:解决程序中函数调用的效率问题.另外,前面我们 ...

  6. java内联函数_Java之内联函数_内联函数的优缺点

    描述 内联函数 1.内联函数就是指函数在被调用的地方直接展开,编译器在调用时不用像一般函数那样,参数压栈,返回时参数出栈以及资源释放等,这样提高了程序执行速度. 2.Java语言中有一个关键字fina ...

  7. 拷贝构造,深度拷贝,关于delete和default相关的操作,explicit,类赋初值,构造函数和析构函数,成员函数和内联函数,关于内存存储,默认参数,静态函数和普通函数,const函数,友元

     1.拷贝构造 //拷贝构造的规则,有两种方式实现初始化. //1.一个是通过在后面:a(x),b(y)的方式实现初始化. //2.第二种初始化的方式是直接在构造方法里面实现初始化. 案例如下: ...

  8. 宏定义和内联函数的学习

    宏定义可以提高效率,但是宏不是函数. 预编译通过代码复制的方式代替函数调用,省去了诸如函数压栈等系统过程,从而提高了效率.但是由于宏定义仅仅是代码替换,所以引起很多问题. #define  MAX(a ...

  9. c++中内敛函数_C++ 内联函数 | 菜鸟教程

    内联函数: Tip: 只有当函数只有 10 行甚至更少时才将其定义为内联函数. 定义: 当函数被声明为内联函数之后, 编译器会将其内联展开, 而不是按通常的函数调用机制进行调用. 优点: 当函数体比较 ...

最新文章

  1. 揭秘阿里中台!一文看懂阿里推荐业务的两大利器
  2. [资料]有关MS SQL 2000安全问题
  3. ASP.NET MVC 3 Beta 发布了
  4. Pandas的学习(5.pandas中处理丢失数据和空值数据以及填充空值数据)
  5. JAVA获取项目工程下的文件
  6. 事业单位职称工资计算机,终于!事业单位绩效工资、职称变了!关系上千万人收入!...
  7. uva1331三角剖分
  8. 20145302张薇《Java程序设计》实验三报告
  9. Entity Framework Core导航属性加载问题
  10. Go 模块--开始使用 Go Modules
  11. 第一周周冠军带你解析赛题,尝试广告算法新思路
  12. pc微信登录扫码显示无法连接服务器,WeAuth微信小程序实现PC网站扫码授权登录...
  13. java你如何调字体大小_eclipse怎样调整代码字体大小 值得一看
  14. 微型计算机原理及应用课程复习与考研指导,微机原理及应用课程复习.doc
  15. 华为手机动态修改手机型号参数
  16. 从苏宁电器到卡巴斯基(后传)第04篇:还愿吾爱破解视频教程大赛
  17. 直播第三方美颜sdk是什么?
  18. 【设计模式】Unity3D 观察者模式
  19. 辽宁大学计算机专业基础考试题型,2018年辽宁大学854计算机专业基础考研大纲...
  20. 【U8+】用友U8数据卸出提示“更改卸载业务单据关闭日期删除后处理出错,错误描述,存储过程没有任何参数”

热门文章

  1. JS fetch()用法详解
  2. 《世界上最伟大的推销员》随记
  3. 用python分析HTTP请求中各过程用时情况(通过分析抓包文件pcap实现)
  4. Happens-Before规则详解
  5. 哲学家吃饭问题-对线程死锁的理解
  6. 【c#期末复习题一】
  7. java中在方法体内抛出异常_Java异常处理中___用于方法体内,抛出一个异常对象。...
  8. IO复用在阻塞IO下的坑及解决
  9. WinSCP使用ssh登入服务器
  10. Promise学习笔记(下)