【C++小知识】为什么C语言不支持函数重载,而C++支持

为什么C语言不支持函数重载,而C++支持

  • 编译链接过程
  • 函数名修饰过程
  • 总结

在了解C++函数重载前,如果对文件的编译与链接不太了解。可以看看我之前的一篇文章,链接: 文件的编译链接

想要清楚为什么C语言不支持函数重载而C++支持,有俩个过程:1.编译链接。2.函数名修饰过程。

编译链接过程

C++编译器与C编译器基本相似,当一个程序运行起来需要经历四个阶段:预处理、编译、汇编、链接。
在这里插入图片描述

假设文件中有一个头文件project.h、俩个源文件project.cpp和test.cpp

  • 在预处理阶段进行:头文件展开、宏定义、条件编译、去掉注释……
    project.h文件与project.cpp文件生成project.i文件
    project.h文件与test.cpp文件生成test.i文件

  • 在编译阶段:检查语法、生成汇编代码
    project.i文件转换为project.s文件
    test.i文件转换为test.s文件

  • 在汇编阶段:汇编代码转换为二进制的机器代码
    project.s文件转换为project.o文件
    test.s文件转换为test.o文件

  • 在链接阶段:生成可执行程序
    在windows环境下project.s与test.s文件会生成一个xxx.exe可执行程序。
    在Linux环境下project.s与test.s文件默认会生成一个a.out可执行程序。

在这里插入图片描述

函数名修饰过程

在了解完函数的编译链接后,当test.cpp文件中调用了project.cpp文件的函数,在编译后链接前是没有拿到函数地址的,这是因为test.cpp文件只包含了test.h文件,在预处理阶段头文件展开只有函数声明,不存在函数定义的地址,函数地址在project.o文件中。

【说明】声明类似于只是一种承诺,还未实现

而在链接阶段是专门为了处理此类型问题,链接器在发现test.o文件中只有函数声明,没有函数定义,就会去另一个.o文件中去寻找,然后链接在一起。

【说明】链接的作用是找到定义(类似于兑现承诺)

在链接时,面对一个函数,不同的编译器会有不同的函数名修饰规则。

  • 在Linux环境下,C语言编译器编译后结果

在这里插入图片描述
结论:在linux环境下,采用gcc编译完成后,函数名字的修饰没有发生改变。

  • 在Linux环境下,C++编译器编译后结果

在这里插入图片描述

结论:在linux环境下,采用g++编译完成后,函数名字的修饰发生改变,编译器将函数参
数类型信息添加到修改后的名字中。

可以发现gcc的函数修饰后名字不变,g++的函数修饰后变成【_Z+函数长度+函数名+类型首字母】

在Windows环境下,命名就比较复杂:
在这里插入图片描述

总结

C语言之间使用名称寻找地址,而C++使用函数名称加类型名称的缩写或者别称寻找地址。

所有C语言是不支持重载的,因为同名函数是无法进行区分的,而C++是通过函数修饰规则来区分,只要参数不同,修饰出来的名字就不同,即C++是支持重载的。

【注意】如果俩个函数名与类型完全相同,返回值不同是不构成重载的,因为编译时,编译器没有办法区分

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/22964.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FFmpeg中 Scaler 使用文档介绍

描述 在 FFmpeg 中,swscale 是一个用于图像缩放和像素格式转换的库,它是 libswscale 的一部分。这个库提供了一系列的功能,允许开发者在视频处理过程中改变视频帧的尺寸和像素格式。以下是 swscale 的一些关键点: 图像重缩放:swscale 允许开发者对视频帧进行尺寸调整,这在…

大模型Prompt-Tuning技术进阶

LLM的Prompt-Tuning主流方法 面向超大规模模型的Prompt-Tuning 近两年来,随之Prompt-Tuning技术的发展,有诸多工作发现,对于超过10亿参数量的模型来说,Prompt-Tuning所带来的增益远远高于标准的Fine-tuning,小样本甚至…

就在刚刚,雷军又做了个10亿的公司

在新能源的滚滚洪流中,宁德时代犹如一艘扬帆起航的巨轮,凭借其在电池技术领域的卓越表现,稳稳占据了行业的领航地位。近日,宁德时代与小米汽车两大巨头携手合作,共同创建了北京时代动力电池有限公司,注册资…

【保姆级讲解Outlook邮箱的使用技巧】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…

Java基础27,28(多线程,ThreadMethod ,线程安全问题,线程状态,线程池)

目录 一、多线程 1. 概述 2. 进程与线程 2.1 程序 2.2 进程 2.3 线程 2.4 进程与线程的区别 3. 线程基本概念 4.并发与并行 5. 线程的创建方式 方式一:继承Thread类 方式二:实现Runable接口 方式三:实现Callable接口 方式四&…

完整状态码面试背

{"100": "继续","101": "切换协议","102": "处理中","103": "早期提示","200": "成功","201": "已创建","202": "已接受",&qu…

安徽某高校数据挖掘作业6

1 根据附件中year文件,编辑Python程序绘制年销售总额分布条形图和年净利润分布条形图,附Python程序和图像。 2 根据附件中quarter和quarter_b文件,编辑Python程序绘制2018—2020年销售额和净利润折线图,附Python程序和图像。 3 …

2025QS世界大学排行榜最新完整版

北京时间6月5日凌晨4点,QS官网发布了备受瞩目的2025年世界大学排名,本次排名共涵盖了1500所顶尖院校,让人们期待已久的排名榜单一览无遗,展现了全球高等教育的新格局。根据上大学网(www.sdaxue.com)统计&am…

HarmonyOS(二十三)——HTTP请求实战一个新闻列表

在前一篇文章,我们已经知道如何实现一个http请求的完整流程,今天就用官方列子实战一个简单的新闻列表。进一步掌握ArkTS的声明式开发范式,数据请求,常用系统组件以及touch事件的使用。 主要包含以下功能: 数据请求。…

delphi操作json

Super json文件 复制另存.pas 引用到项目 (* * Super Object Toolkit * * Usage allowed under the restrictions of the Lesser GNU General Public License * or alternatively the restrictions of the Mozilla Public License 1.1 * * Sof…

1103. 分糖果 II Rust等差求和+一元二次方程求根(击败100% Rust用户)

题目内容 排排坐,分糖果。 我们买了一些糖果 candies,打算把它们分给排好队的 n num_people 个小朋友。 给第一个小朋友 1 颗糖果,第二个小朋友 2 颗,依此类推,直到给最后一个小朋友 n 颗糖果。 然后,…

salesforce发送邮件时出现错误insufficient access rights on cross-reference id

当您在Salesforce中发送电子邮件时遇到“insufficient access rights on cross-reference id”错误,通常是由于以下原因之一引起的: 缺少对象权限:用户可能没有对相关对象(如案例、联系人、机会等)的适当访问权限。缺…

pnpm包管理器总结

一、概述 pnpm(performant npm)是一个高性能的包管理器,旨在解决npm和yarn等包管理器在依赖管理和磁盘空间使用上的常见问题。它的slogan是“Fast, disk space efficient package manager”,即快速、节省磁盘空间的包管理工具。 …

C语言中指针的说明

什么是指针? 在C语言当中,我们可以将指针理解为内存当中存储的地址,就像生活当中,一个小区里面,在小区里面有很单元,每一栋单元,单元内的房间有着不同的房间号,我们可以同过几栋几单…

Server did not offer supported security type!问题解决

1.问题介绍 出现这种问题是我想用MobaXterm中的VNC连接树莓派。输入IP地址后输入密码出现这种错误,但是我可以通过SSH进行正常连接,也可以通过另外一个VNC软件进行连接,但是为了方便切换,用一个软件就可以完成上述问题&#xff0c…

Docker 进入指定容器内部(以Mysql为例)

文章目录 一、启动容器二、查看容器是否启动三、进入容器内部 一、启动容器 这个就不多说了 直接docker run… 二、查看容器是否启动 查看正在运行的容器 docker ps查看所有的容器 docker ps -a结果如下图所示: 三、进入容器内部 通过CONTAINER ID进入到容器…

FFA-Net:用于单图像去雾的特征融合注意力网络

摘要 论文链接:https://arxiv.org/pdf/1911.07559v2 在这篇论文中,我们提出了一种端到端的特征融合注意力网络(FFA-Net)来直接恢复无雾图像。FFA-Net架构由三个关键组件组成: 一种新颖的特征注意力(FA&…

C语言笔记第10篇:内存函数

上一篇的字符串函数只是针对字符串的函数,而内存函数是针对内存块的,不在乎内存中存储的数据!这就是字符串函数和内存函数的区别。 准备好爆米花,正片开始 1、memcpy的使用和模拟实现 memcpy库函数的功能:任意类型数…

Element ui图片上传

前言 对于广大小白来说,图片上传简直是上传难,难于上青天!废话不多说,步入正题,您就瞧好吧! 步骤一:前端使用element ui组件(upload上传) 我个人喜欢使用第二个组件&a…

ingress规则

一 k8s 对外服务之 Ingress LB ingress 1 Ingress 简介 service的作用体现在两个方面 ? ① 对集群内部,它不断跟踪pod的变化,更新endpoint中对应pod的对象,提供了ip不断变化的pod的服务发现机制; ② 对集群外部&#xff0c…