C++中宏与内联函数

C++ | 对比inline内联函数和宏的不同点 C语言的宏与C++的内联函数有和不同,王者荣耀安装包为何这么大,本文告诉你 阅读详情

1宏定义

C++是C的超集,C++继承了C的一个重要特性就是效率,在C中提高程序运行效率的重要手段就是宏,宏可以不用普通函数的调用但使用起来就像普通函数调用一样,宏的实现采用的是预处理器而不是编译器,所以就没有了参数调用、生成汇编语言的CALL,返回参数和执行汇编语言RETURN等时间的花费,因而大大提高了程序执行的效率。当然在C++中也可以采用这种方式提高程序执行的效率。

例如:

#include<iostream.h>

#define doub(x) x*2

int main()

{

for(int i=1;i<=3; i++)

cout<<i<<"doubled is "<<doub(i)<<endl;

cout<<"1+2doubled is "<<doub(1+2)<<endl;

return 0;

}

程序运行的结果为:

1 doubled 2

2 doubled 4

3 doubled 6

1+2 doubled 5

当程序运行到cout<<i<<"doubled is "<<doub(i)<<endl;和cout<<"1+2doubled is "<<doub(1+2)<<endl;时,直接将宏定义的代码在程序中直接展开,这样就省去了函数调用的开销,大大提高了程序执行的效率。

2内联函数

在C++中,函数说明之前,冠以关键字"inline",该函数就被声明为内联函数。它和宏定义有着相同的作用和相似的机理,在内联函数被调用时,C++的编译器使用函数体中的代码替代函数调用表达式,这样就较少的函数调用的开销,加快的了程序的执行。

例如:

#include<iostream.h>

inline float circle(float r)

{return 3.1416rr;}

int main(){

for(int i=1;i<=3;i++)

cout<<"r=“<<i<<” area="<<circle(i)<<endl;

return 0;

}

程序运行的结果为:

r=1 area=3.1416

r=2 area=12.5664

r=3 area=28.2744

当程序运行到cout<<"r=“<<i<<” area="<<circle(i)<<endl;时直接将定义的内联函数在程序展开,减少了普通函数调用的开销,提高了程序执行的效率,这一点和宏定义非常相似,但是两者又不完全相同,而且有着非常重要的区别。

3两者之间的区别

对于上面的第二道例题采用内联函数和宏定义,所得的程序运行的结果应该是相同的,那么它们之间的区别在哪里呢?我们再来研究一下上面的第一道例题。虽然宏定义在外观和行为上与函数调用一样,但是当微妙的差异出现时,问题就出现了。例如对于第一道例题,该程序所定义的宏是完成乘2的功能,那么分析程序运行的结果,可以看出前三个结果是正确的,但是第四个结果与期望的值由区别,我们期望的结果应该是6,而实际运行的结果却是5,问题的原因是编译程序将输出语句cout<<"1+2doubled is "<<doub(1+2)<<endl;解释为cout<<"1+2doubled is "<<1+2*2<<endl;,它改变了原先我们所期望的运算符的优先级的次序,所以所得的结果也不是我们事先所期望的,程序执行的结果为5。由这个例子可以看出宏定义本身存在着一定的不安全性,有时会隐藏难以发现的错误。相反,如果这个例子采用内联函数来完成的话,实验证明,程序运行的结果为:

1 doubled 2

2 doubled 4

3 doubled 6

1+2 doubled 6

通过这个例子,我们可以看出内联函数和宏定义之间的区别,内联函数消除了宏定义存在着的潜在的不安全

性,因此,大多数程序员在编写程序的时候,很少采用宏定义。

4结论

下面我们研究一下造成这种区别的根本原因,宏定义的实现是通过预处理器,而内联函数的实现是通过编译器,正是这样的差别造成了以上程序运行结果的不同。宏定义存在的关键问题是我们可能认为预处理器的行为和编译器的行为一样,因此在使用过程中容易被混淆。

最后,学习从来不是一个人的事情,要有个相互监督的伙伴,对于C/C++感兴趣可以搜素千人群:C/C++学习编程13群(jack建立)有兴趣交流或者了解一下的可以进来交流,另外进群就可以领取相关的学习资料哦

【参考文献】

[1]王菊英. 当前我国利率走势探究[J]. 经济师 , 2003,(05)

[2]刘繁荣.建设学习型企业之管见[J]现代管理科学 , 2004,(04)

[3] 任美姣. 浅谈合作探究教学模式[J]. 浙江工商职业技术学院学报 , 2003,(02)

[4]齐善鸿. 分合的逻辑与趋势–对企业两权分合的研究与思考[J]. 理论与现代化 , 1999,(01)

[5]杨则正. Symantec公司的C++8.0编译器[J]. 管理科学文摘 , 1998,(11)

[6]杨凡. 浅析C++中内联函数与宏的区别[J]. 科技咨询导报 , 2007,(01)

[7]郑冉冉. 企业营销道德问题探究[J]. 江苏商论 , 2005,(07)

[8]付昱纲. 网络名人:C++之父――Stroustrup[J]. 教育与职业 , 2003,(18)

[9]杨勇. 我国独立董事职业化道路的探究[J]. 经济前沿 , 2005,(06)

[10]陈永强. 《电子商务概论》课程大纲探究[J]. 杭州师范学院学报(医学版) , 2005,

[11]]《c + + 语言和面向对象程序设计教程》 陈维兴 林小茶 编著 清华大学出版社 2000. 1

【C++】第四节——宏和内联函数 文章目录????为什么宏函数存在副作用内联函数????为什么内联函数特性补充debug和release 的区别Debug 版本Release 版本 ????为什么 ????为什么a的值已经被改变为100了,但是输出了时候还是10? 在c++中,被const 修饰的变量一般被称为常量,且具有宏替换的作用 在编译阶段,在所有使用const常量的位置,用常量的值代替该常量(注意:&常量除外) 代码必须经过预处理,编译,汇编,链接才可以执行,所以在编译阶段,编译器就直接将a替换成了10,所 阅读详情

相关推荐

C++ 内联函数也可以用来代替宏

发生函数调用时,编译器会先对实参进行计算,再将计算的结果传递给形参,并且函数执行完毕后会得到一个值,而不是得到一个表达式,这和简单的字符串替换相比省去了很多麻烦,所以在编写 C++ 代码时我推荐使用内联函数来替换带参数的宏。说了这么多,我最终想强调的是,宏定义是一项 “细思极密” 的工作,一不小心就会踩坑,而且不一定在编译和运行时发现,给程序埋下隐患。这是因为,宏展开仅仅是字符串的替换,不会进行任何计算或传值,上面的。这一点和非内联函数不同,非内联函数是禁止定义在头文件中的,它所在的头文件被多次。

白粥 197

【C++】C++中内联函数详解(搞清内联的本质及用法)

什么是内联函数、为什么使用内联函数、比较使用C++使用类和C不使用类实现同一个功能的对比、类定义内联函数分类、内联与宏、内联的局限性、内联的使用建议

qq_35902025的博客 6万+

银河麒麟V10离线安装VLC播放器:依赖处理与3.0.9.2版本实操指南

在国产化操作系统日益普及的背景下,软件安装方式成为政企内网用户关注的重点。离线安装作为一种不依赖公网源的部署手段,常用于解决内网环境下的软件获取问题。其核心在于理解Linux包管理机制,如dpkg与apt对依赖关系的处理逻辑。掌握这一原理,不仅能应对多媒体软件的部署,也能提升系统维护效率。VLC作为跨平台多媒体播放器,凭借强大的解码能力与协议支持,广泛应用于本地视频播放、RTSP拉流及监控大屏等场景。本文从离线安装的通用概念出发,结合银河麒麟V10桌面版的实际环境,详细梳理了VLC 3.0.9.2离线包的获

weixin_32247165的博客 367

C++之 内联函数

在C语言中我们可以使用宏和函数,但是它们都有其自身的缺点。那C++中有没有一种技术既可以整合它们其中的优点、又弥补了他么的缺点呢?那就是本篇文章介绍的C++内联函数。我们一起来看看吧~~~~......

Brant_zero的博客 4587

千兆网口电路设计中的EMC防护与TVS选型实战

本文深入探讨了千兆网口电路设计中面临的EMC挑战,并提供了TVS二极管选型的实战指南。文章分析了ESD、浪涌和EFT等主要威胁,重点阐述了如何根据工作电压、钳位电压和关键的低结电容等参数为PHY芯片选择匹配的TVS器件,以确保在严苛电磁环境下实现可靠的信号完整性与防护。

m3n5b7v8c9x的博客 530

Android开发必备:TBS腾讯浏览服务静态集成完整指南(附Demo下载)

本文详细解析了Android开发中TBS腾讯浏览服务的静态集成方案,通过对比动态集成,深入剖析了其核心原理与适用场景。文章提供了从环境准备、资源获取、项目配置到代码初始化的完整指南,并重点介绍了WebView与文件预览等高级特性的实战应用。针对集成过程中的常见问题,提供了详尽的排查清单与性能调优建议,旨在帮助开发者构建极致稳定、不依赖网络的WebView与文件预览功能。文末附有经过验证的Demo项目可供下载参考。

earth的博客 366

【C++】之内联函数(inline)

inline详解,从汇编角度出发,带你深入理解inline

Hello_World_213的博客 6837

Calibre电子书阅读器个性化样式定制指南

本文详细介绍了如何通过Calibre电子书阅读器的用户样式表功能进行深度个性化样式定制。从修改全局字体、行距、背景配色(包括深色/浅色模式)到美化代码块、引用等特殊元素,本指南提供了完整的CSS代码示例与实战技巧,帮助用户打造专属的舒适阅读环境,显著提升电子书阅读体验。

vv45678的博客 920

C++·初步认识(内联函数)

C++中内联函数是什么,在什么情况下内联函数有效。内联函数自身的局限性以及相较于#define的优秀性。

czy02的博客 1937

用 MATLAB 实现鼻子和嘴的检测

为了方便起见,这里我们使用了 CascadeObjectDetector 中自带的 haarcascade_frontalface_alt2.xml 文件,该文件包含了多个包含鼻子和嘴的样本图像。其中 bbox 变量表示检测到的所有鼻子和嘴的边界框信息。在图像处理中,鼻子和嘴的检测是十分重要的一项任务。本文将介绍如何使用 MATLAB 实现鼻子和嘴的检测,并提供相应的源代码。然后,我们可以调用之前创建的 detector 对象来进行鼻子和嘴的检测。综上所述,我们可以使用以上代码实现鼻子和嘴的检测。

qq_39605374的博客 256

电子元件及其规格书的查找与理解

本内容收录:在电子开发或维修过程中,查找电子元件及其规格书心得体会,以及元件规格书的理解,系个人多年实战经验的系统梳理。内容着重介绍贴片元件代码反查型号的实用技巧,并以三款典型疑难元件为例,详述其完整查找过程与最终型号确认。

让你爱上电路设计 3987

【C++入门】内联函数

详解C++中的内联函数。

m0_74352571的博客 2861

pytorch搭建SSAE实现预测分类代码模板完整代码

pytorch搭建SSAE实现预测分类代码模板完整代码

323

C++ 宏与内联函数

因为函数调用需要开销(如:保护调用者的运行环境、参数传递、执行调用指令等),所以函数调用会带来程序执行效率的下降,特别是对一些小函数的频繁调用将是程序的效率有很大的降低。     C++提出了两种解决方法:宏、内联函数。 1. 宏     宏是C++编译预处理系统处理的实体。     宏定义的4种格式:     1)#define          在编译前进行使用文字串进行宏替换

冲冲冲 8082

车牌识别系统

随这图形图像技术的发展,现在的车牌识别技术准确率越来越高,识别速度越来越快。无论何种形式的车牌识别系统,它们都是由触发、图像采集、图像识别模块、辅助光源和通信模块组成的。车牌识别系统涉及光学、电器、电子控制、数字图像处理、计算视觉、人工智能等多项技术。触发模块负责在车辆到达合适位置时,给出触发信号,控制抓拍。辅助光源提供辅助照明,保证系统在不同的光照条件下都能拍摄到高质量的图像。图像预处理程序对抓拍的图像进行处理,去除噪声,并进行参数调整。然后通过车牌定位、字符识别,最后将识别结果输出。 牌照自动识别是一

FPGA/MATLAB学习教程/源码/项目合作开发 2万+

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

【C++入门】你知道C++为什么会有内联函数吗?宏和内联函数的区别是什么?

详谈内联函数,内附面试题

Weraphael的博客 909

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

C++宏与内联函数(inline)的联系及区别

摘要: 宏与内联函数在C++中均用于优化性能,但机制与适用场景不同。宏是预处理阶段的文本替换工具,灵活性高但缺乏类型安全,易引发调试问题;内联函数由编译器处理,保留语义完整性,适合高频调用的简单函数。宏适用于条件编译等预处理需求,而内联函数更推荐用于类型安全的代码复用。最佳实践是优先使用内联函数,仅在宏不可替代时(如条件编译)选用宏,同时注意规避二者的潜在风险(如宏的多次求值、内联的代码膨胀)。现代编译器优化能力强大,可自动判断内联必要性。

qq_39980997的博客 946

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

【C++】内联函数是什么?内联和宏有什么区别?

目录 什么是内联函数? 什么时候使用内联函数? 内联函数和常规函数的区别 如何使用内联函数? 注意: 代码示例 运行结果: 内联与宏有什么区别 什么是内联函数? 内联函数是C++为了提高程序运算速度所做的一项改进。 内联函数 的编译代码与其他程序的代码“内联”起来,也就是不用乱跳来跳去,编译器将使用的相应的函数代码替换函数调用。 什么时候使用内联函数? 内联函数的 运...

王博(Kings)的博客 2779

【C++】内联函数vs宏 && nullptr

inline不建议声明和定义分离到两个⽂件,分离会导致链接错误。因为inline被展开,就没有函数地址址,链接时会出现报错。return 0;解决这个问题就直接把定义和声明写到同一个头文件中这样内联函数在展开的时候就可以找到地址#nullptrC++中NULL可能被定义为字⾯常量0,或者C中被定义为⽆类型指针(void*)的常量。不论采取何种。

apple_61439616的博客 886

【C++】内联函数代替宏

以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方直接展开,没建立栈帧的开销(和宏定义一样),内联函数提升程序运行的效率

F091500的博客 572

c++内联函数与c宏

在c中我们可以使用带参数的宏来进行类似函数的实现:使用宏不需要检查变量类型,在某些情况下对于实现简单的函数比较方便;使用带参数的宏可以避免由于函数调用带来的额外开销。 但要注意带参数的宏和函数的区别:宏在编译之前就被处理掉了,不参与编译,不会占用内存,其本质仅仅是字符串的替换。而函数会被编译,会给它分配内存,每次调用函数,就是执行这块内存中的代码。 所以使用宏可能会发生一些难以察觉的副作用。 c+...

weixin_45477786的博客 394

C++——内联函数还可以用来代替宏?

1、宏 宏的优点:宏函数在预处理阶段展开了,减少了函数调用的开销(传参,参数压栈以及栈帧花销)...... 宏的缺点:宏函数可能会存在一定的副作用;在预处理阶段进行替换,不会参与编译,少了类型检测;宏函数不能调试...... 在C++中,宏常量可以用const修饰的常量来代替,宏函数可以用内联函数来代替 2、const修饰的变量 在C语言中,const修饰的变量不能成为常量,只能称为不能被修改的变量 在C++中,被const修饰的变量称为常量,且有宏替换的功能 被const修饰的变量的替换发生

m0_46657980的博客 1030

【C++】内联函数,宏和const概念

先来看一段有趣的代码: int main() { const int a = 10; int* pa = (int*)&a; //&a ---> const int* --->表明该地址指向的空间内容不允许被修改,必须强转(int*) *pa = 100; cout << a << ' ' << *pa << endl; return 0; } 输出结果:10 100 可以看到a的内容已经被修改成了100,为

Yfan133的博客 297

c++内联函数与宏的区别

c++内联函数 c++内联函数与常规函数的主要区别不在于编写方式的不同。在于c++编译器如何将它们组合到程序中。 执行到函数调用指令时,程序将立即存储该指令的内存地址,变将函数复制到堆栈,跳到标记函数起点 的内存单元,执行函数代码,函数体执行完后跳到地址被保存的指令处。来回跳跃并记录跳跃位置,需要 一定的开销。 c++内联函数提供另外一种选择,编译器将使用相应的函数代码替换函数调用。程序

wenbinsan的专栏 1020

【C++】C++内联函数也可以用来代替宏

宏是可以带参数的,它在形式上和函数非常相似。不过不像函数,宏仅仅是字符串替换,不是按值传递,所以在编写宏时要特别注意,一不小心可能就会踩坑。   #define SQ(y) y*y 当n = 9 时,SQ(n) = 81 如果把SQ(n)换成SQ(n+1)却得不到100,因为sq = n+1*n+1;   如果希望得到正确的结果,应该将宏定义改为如下的形式: #define SQ(y...

王磊的博客 3764

C++ —— 代替宏的inline内联函数与const

内联函数 在C++中宏函数的概念是使用内联函数来实现的,而无论从哪一方面来说,内联函数都是真正的函数。唯一不同之处是内联函数在适当的地方像宏一样展开,所以不需要函数调用的开销。 任何在类中定义的(在花括号内)函数会自动地成为内联函数; 开栈的开销 > 执行的开销 建议设为inline 开栈的开销 < 执行的开销 不建议 代码膨胀 注意事项 对于那些函数体代码量很小,又经常调用的函数,一般用作内联函数。因为函数体代码很小,函数体执行的时间远小于调用函数的时间,从而提高代码执行效率。 一

ifwecande的博客 594
上一篇: 同样是学编程,为什么别人十几岁就成了黑客,而你还在做码农
下一篇: 为何程序C语言不会消亡?程序员学习C会白学吗?
CodingPs
博客等级 码龄7年 182粉丝 253原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值