宏定义和inline函数的关联
inline函数是C++引入的机制,目的是解决使用宏定义的一些缺点。
内联函数与宏定义区别
(1)内联函数在编译时展开,宏在预编译时展开;
(2)内联函数直接嵌入到目标代码中,宏是简单的做文本替换;
(3)内联函数有类型检测、语法判断等功能,宏没有;
(4)inline函数是函数,宏不是;
(5)宏定义时要注意书写(参数要括起来)否则容易出现歧义,内联函数不会产生歧义;
为什么要引入内联函数?
用内联函数替代宏定义,消除宏定义的缺点:
宏定义使用预处理器实现,做一些简单的字符替换,因此不能进行参数有效性的检测。
宏定义的返回值不能被强制转换为可转换的合适类型。
C++中引入了类及类的访问控制,在涉及到类的保护成员和私有成员就不能用宏定义来操作。
inline相比宏定义有哪些优越性
(1)inline函数代码是被放到符号表中,使用时像宏一样展开,没有调用的开销,效率很高;
(2)inline函数是真正的函数,所以要进行一系列的数据类型检查;
(3)inline函数作为类的成员函数,可以使用类的保护成员及私有成员;
inline函数使用的场合
(1)使用宏定义的地方都可以使用inline函数;
(2)作为类成员接口函数来读写类的私有成员或者保护成员;
为什么不能把所有的函数写成inline函数?
内联函数以代码复杂为代价,它以省去函数调用的开销来提高执行效率。
一方面如果内联函数体内代码执行时间相比函数调用开销较大没有太大的意义;
另一方面每一处内联函数的调用都要复制代码,消耗更多的内存空间,因此以下情况不宜使用内联函数:
(1)函数体内的代码比较长,将导致内存消耗代价;
(2)函数体内有循环,函数执行时间要比函数调用开销大;
————————————————
版权声明:本文为CSDN博主「长期读书」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_22186119/article/details/108327155
宏定义和inline函数的关联相关推荐
- 用宏定义代替printf函数
问题提出 有时候我们想用宏定义来决定是编译debug版本的代码还是release的代码,dubug版本的代码会通过printf打印调试信息,release版本的代码则不会.我们总不能对每一条print ...
- #define宏定义形式的函数导致的bug
定义了一个宏定义形式的"函数": #define SUM8(YY)\ {\ int Y = YY>>2;\ ...\ } 然后使用的时候,传入了一个同名的变量Y: i ...
- 【GCC编译优化系列】宏定义名称与函数同名是一种什么骚操作?
作者简介 *架构师李肯(全网同名)**,一个专注于嵌入式IoT领域的架构师.有着近10年的嵌入式一线开发经验,深耕IoT领域多年,熟知IoT领域的业务发展,深度掌握IoT领域的相关技术栈,包括但不限于 ...
- 函数式宏定义与普通函数的区别?C语言宏定义和宏定义函数 ?
http://www.jb51.net/article/41869.htm 尽管函数式宏定义和普通函数相比有很多缺点,但只要小心使用还是会显著提高代码的执行效率,毕竟省去了分配和释放栈帧.传参.传返回 ...
- C语言学习笔记--预编译/宏定义/数组/参数传递/函数指针
目录 预编译 值传递.指针传递.引用传递 数组 typedef 函数指针 预编译 预编译又叫预处理.预编译不是编译,而是编译前的处理.这个操作是在正式编译之前由系统自动完成的.#define 和 #i ...
- 如何用#define宏定义多行函数
在软件开发过程中,经常有一些常用或者通用的功能或者代码段,这些功能既可以写成函数,也可以封装成为宏定义.那么究竟是用函数好,还是宏定义好?这就要求我们对二者进行合理的取舍. 首先,函数调用会带 ...
- c语言数组宏定义标识符,C语言学习笔记--预编译/宏定义/数组/参数传递/函数指针...
目录 预编译 值传递.指针传递.引用传递 数组 typedef 函数指针 预编译 预编译又叫预处理.预编译不是编译,而是编译前的处理.这个操作是在正式编译之前由系统自动完成的.#define 和 #i ...
- Source Insight4.0结构体使用宏定义之后,成员没关联?
今天使用SI发现有BUG?还是就是没办法显示关联 例如: 此时没办法识别结构体指针GPIOB的成员 但如果直接把GPIOB定义为全局变量,类型为结构体指针就可以关联,如图: 但是我发现KEIL5中这种 ...
- C语言字符串、宏定义及主函数介绍
希望你每天醒来都是阳光的,不会因为别人的几句话.几个表情和几个举止,影响自己的心情,好好生活,总会遇见美好的事... ---- 网易云热评 一.字符串 1.字符串声明 #include <st ...
最新文章
- python解释器环境中、用于表示上一次_大工20秋《数据挖掘》在线作业3 【标准答案】...
- mysql没有err文件_xampp中的mysql启动时无法产生err文件
- 简解Css - 多变的边框
- 脆弱的Scrum,敏捷在哪里?
- JavaScript中短时间高频次触发事件的优化
- IE-OLD IE 提示
- bzoj 2330: [SCOI2011]糖果
- 算法-低位优先的字符串排序
- 哪些网站在+1s后有神奇的功能
- rm、shutdown、磁盘挂载、vi使用方法
- Bootstrap3 插件的事件
- java存款输入密码类,创建一个银行账户类,包括账号、用户姓名、密码和余额属性,实现开户、查询余额、取款、存款功能。...
- 敏捷、TDD(测试驱动开发)、OO--前奏
- 【原创】通俗易懂地解决中文乱码问题(1) --- 跨平台乱码
- linux atom编码设置,Ubuntu中Atom编辑器显示中文乱码的处理方法
- PLC状态机编程第六篇-优化PLC程序生成
- 架构师重构代码的12条军规
- Uiautomator入门(初学者用)
- 鸿蒙系统电脑模拟运行,安卓游戏在鸿蒙运行被识别为PC端模拟器,鸿蒙生态依然欠缺!...
- 简易抽签程序(数字滚动 HTML + JavaScript)
热门文章
- 计算机设备管理器没有网络适配器,Windows10设备管理器中没有网络适配器怎么解决...
- 杰理AC692X---开关机实现方式
- 阿里P8熬了一个月肝出这份阿里内部(泰山版),在Github标星31K+
- iOS 暗黑模式适配(项目实战篇)
- 你要确认你现在所拥有的东西,深挖你拥有的东西背后的价值是什么
- openwrt透明代理绕过公司的forticlient
- 6. Python的数据类型④——元组
- javaScript---- RegExp-常用正则表达式
- UC神马乘风大会抵沪 助力中小企业营销升级
- 这种情况到底怎么解决,求帮忙