C++练级之初级:第三篇

这篇具有很好参考价值的文章主要介绍了C++练级之初级:第三篇。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

C++练级之初级:第三篇

1.探索C++中函数重载的本质

🤔首先我们先解决一下为什么C++支持函数重载,而C语言不支持?

这里就不得不提起编译链接了😁;
👉这是编译链接篇
C++练级之初级:第三篇
以这三个简单的文件为例:

C++练级之初级:第三篇

  1. 预处理阶段: 头文件的展开,条件编译,宏的替换,注释的删除等,最终处理完这些后test.c就会变成test.i,add.c就会变成add.i;
    C++练级之初级:第三篇

  2. 编译阶段: 词义分析,符号汇总(函数名,全局变量),语法分析,语义分析,将代码转换为汇编代码,最终处理完这些后test.i会变成test.s,add.i会变成add.s,注意这里只是对符号进行了汇总还没有获取到符号的地址;

C++练级之初级:第三篇
3. 汇编阶段: 形成符号表,将汇编语言转换为二进制的机器语言,然后test.s变成test.o,add.s变成add.o;

C++练级之初级:第三篇
4. 链接阶段: 进行符号表的合并和重定位,段表的合并,相当于把多个.c文件链接起来了,最后在windows环境下生成.exe文件,在Linux环境下生成a.out(可以改),这里就能获得最终的函数地址

C++练级之初级:第三篇


我们以Linux环境为例
C++练级之初级:第三篇

这是Linux下gcc (C语言编译器) 编译后的结果:

C++练级之初级:第三篇

我们发现C语言在编译期间函数名并未发生改变;

这是Linux下g++ (C++编译器) 编译后的结果:

C++练级之初级:第三篇

我么发现C++在编译阶段函数名进行了修饰;


🤔🤔C++的函数名字修饰规则是什么?

【_Z+函数名长度+函数名+数据类型首字母】;

综上所述: C语言没办法支持重载,因为同名函数没办法区分。而C++是通过函数修饰规则来区分,只要参数不同,修饰出来的名字就不一样,就支持了重载。

🤔🤔🤔为什么当函数参数列表项同时,返回值类型不同不构成函数重载?

假设函数名字修饰规则中有返回值的写入,那么在链接阶段编译器是无法区分你要调用的是哪个函数;


在windows环境下,vs也有自己的函数名字修饰规则,逻辑上是和Linux下函数名字修饰规则一样的,但是vs中的函数名字的修饰规则太复杂;

C++练级之初级:第三篇文章来源地址https://www.toymoban.com/news/detail-421982.html

到了这里,关于C++练级之初级:第三篇的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C++】类与对象 第三篇(初始化列表,explicit,static,友元,内部类)

    目录 再谈构造函数 构造函数体赋值 初始化列表 explicit static成员 匿名对象 友元 友元函数 友元类 内部类 拷贝对象时的一些编译器优化 在创建对象时,编译器通过调用构造函数给对象各个成员变量一个合适的初始值 虽然上述构造函数调用之后,对象中已经有了一个初

    2024年02月05日
    浏览(46)
  • Vue基础第三篇

    1 checkebox:     -单选     -多选 2 radio     -单选 示例: 2.1 基本购物车 补充: 2.3加减数量版 v-model 之 lazy、number、trim lazy:等待input框的数据绑定时区焦点之后再变化 number:数字开头,只保留数字,后面的字母不保留;字母开头,都保留 trim:去除首位的空格 前后端要打通

    2024年02月08日
    浏览(38)
  • Vue中的MVVM【第三篇】

            MVVM图示  🌈 一、MVVM简介          简单来说: MVVM(M-VM-M) ,一种更好的UI模式解决方案,MVVM通过数 据双向绑定 让数据 自动地双向同步。 M(Model):Model数据模型,json格式数据 V(View):View视图,jsp、html VM(ViewModel):ViewModel视图模型   🌈 二、MVVM详解        我以

    2024年02月04日
    浏览(39)
  • Java语言第三篇集合

    集合和数组的对比 数组的长度是不可变的,集合的长度是可变的。 数组可以存基本数据类型和引用数据类型。集合只能存引用数据类型,如果要存基本数据类型,需要存对应的包装类。 Collection 集合 是单例集合的顶层接口,它表示一组对象,这些对象也称为Collection的元素

    2024年01月23日
    浏览(71)
  • 第三篇 Elasticsearch 安装 - RPM方式

            上一篇我们学习了使用“压缩包”的方式安装Elasticsearch,本篇我们将学习使用RPM的方式安装Elasticsearch。在工作中具体使用哪一种安装方式要根据公司情况判定。         学习的小伙伴如果想学习一下自己制作启动脚本(shell)、开机自启动等可以使用安装包的方

    2024年04月10日
    浏览(36)
  • Solidity 合约安全,常见漏洞(第三篇)

    如果你只处理受信任的 ERC20 代币,这些问题大多不适用。然而,当与任意的或部分不受信任的 ERC20 代币交互时,就有一些需要注意的地方。 ERC20:转账扣费 当与不信任的代币打交道时,你不应该认为你的余额一定会增加那么多。一个 ERC20 代币有可能这样实现它的转账函数,

    2024年02月09日
    浏览(38)
  • SpringCloud第三篇:GateWay服务网关

          传统的单体架构中只需要开放一个服务给客户端调用,但是微服务架构中是将一个系统拆分成多个微服务,如果没有网关,客户端只能在本地记录每个微服务的调用地址,当需要调用的微服务数量很多时,它需要了解每个服务的接口,这个工作量很大。那有了网关之后

    2024年02月08日
    浏览(45)
  • 网络基础(第三篇)子网掩码

    文章目录 一、IP地址 二、 子网掩码 IP地址是什么? 在网络中用来标识设备的具体地址,数据需要通过此进行寻址传输。   IP地址的组成: 网络部分: 用来标识一个网络。代表IP地址所属网络,处于高位; 主机部分: 用来区分一个网络内的不同主机,能唯一标识网段上的某台

    2024年02月04日
    浏览(32)
  • 【jenkins】第三篇:jenkins凭据管理

    凭证管理 【系统管理】—【凭据管理】 1.1 创建Gitlab私人令牌 点击创建后,提示个人令牌,一定要先复制出来保存好,因为一刷新页面token就看不到了。 1.2 添加Gitlab API令牌凭据 【系统管理】—【凭据】—【全局】—【添加凭据】 选择 Gitlab API 令牌 类型,输入 Gitlab私人令牌

    2024年02月03日
    浏览(62)
  • 第三篇|金融人数据来源有哪些

       数据对于金融行业真的很重要,那么金融人有哪些途径查数据呢? 国内: 1. 国家统计局 这个应该是无论什么行业都使用最频繁的网站,每个月都会固定发上个月资产投资数据 、工业增加值和利润数据等常规数据,其他数据也会有,但更新会延迟,可能借助其他网站。

    2024年02月12日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包