c++为什么支持函数重载?

news2024/10/7 7:26:11

前言

在c语言中,函数名是不可以重复的,在同一作用域中函数名称都是唯一的。这也使得我们的函数调用充满了种种麻烦。
而c++则支持通过函数重载解决了这个问题
函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同,常用来处理实现功能类似数据类型不同的问题。

C++为什么支持函数重载

为什么c语言不支持函数重载而c++能支持呢?
想要解释这个问题要先从编译链接说起
以以下代码举例

//fanc.h
#include<stdio.h>
int fanc(int i ,double d);
int fanc(int i ,int d);
//fanc.cpp
#include"fanc.h"
int fanc(int i,double d)
{
  printf("fanc(int double)\n");

}
int fanc(int i,int d)
{
  printf("fanc(int i)\n");
}
//main.c
#include"fanc.h"
int main()
{
  fanc(1,1.1);
  fanc(1,1);
  return 0;
}

编译链接

以上三个文件变成可以执行文件需要经历以下步骤
以gcc编译器为例
在这里插入图片描述

预处理:

在预处理阶段,gcc会对源文件进行预处理操作。预处理器根据预处理指令(例如#include和#define等)对源代码进行处理。
预处理器的主要任务包括:

展开宏定义:

  • 将代码中的宏展开为其定义的内容。
  • 处理条件编译指令:根据条件编译指令(例如#ifdef和#ifndef)来控制代码的编译。 删除注释:删除源代码中的注释部分。
  • 处理包含文件(#include):将包含的头文件插入到源代码中的对应位置。 处理其他预处理指令:例如#error、#pragma等。

预处理后的文件称为预处理文件,通常以.i作为扩展名。

编译:

在编译阶段,gcc将预处理文件(也可以是源文件)转化为汇编语言代码。
编译器会对代码进行语法和语义检查,并将代码翻译为汇编语言的表示形式。

编译阶段的主要任务包括:

  • 语法检查:检查源代码是否符合语法规范。
  • 语义检查:检查变量类型、函数调用以及其他语义错误。
  • 生成汇编代码:将输入的源代码转换为汇编代码。

编译生成的文件称为汇编文件,通常以.s作为扩展名。

汇编:

汇编阶段使用汇编器将汇编代码转换为机器码指令,生成目标文件(Object File)。
汇编器会将汇编代码根据汇编语言的规则转换为与特定处理器架构兼容的机器指令。

汇编阶段的主要任务包括:

  • 将汇编代码转换为机器码指令。
  • 生成符号和调试信息。
  • 汇编生成的文件称为目标文件,通常以.o作为扩展名。

链接:

在链接阶段,连接器将目标文件与所需的库文件进行链接,生成最终的可执行文件(Executable File)。
链接器的主要任务包括:

  • 符号解析:解析目标文件和库文件中的符号引用和定义,将符号引用与定义进行匹配。
  • -符号重定位:将目标文件中的地址信息重新定位,以便正确执行。
  • 生成可执行文件:将符号解析和重定位后的目标文件链接在一起,生成可执行文件。

最终生成的可执行文件通常不包含源代码,可以直接在操作系统中运行。

c语言不能实现函数重载的原因就在于链接这一步
在汇编过程中函数会生成符号表

编译阶段的符号表包含了当前源代码文件中定义的变量、函数和其他标识符的信息。每个源文件编译时会生成自己的符号表。编译器将源代码转换为机器代码,并将符号引用替换为相应的地址或偏移量。

链接阶段的符号表则用于解析不同目标文件之间的符号引用关系。链接器负责将多个目标文件合并成一个可执行文件或库文件。在链接过程中,链接器会合并各个目标文件中的符号表,检查并解决符号的定义和引用之间的关联。

在合并符号表时,链接器执行以下操作:

  • 符号解析:链接器遍历所有目标文件的符号表,将每个符号引用与一个符号定义关联起来。如果找不到符号的定义,链接器会报错。
  • 符号合并:如果多个目标文件中有相同名称的符号,链接器将尝试将它们合并为一个符号。这通常用于解决多个目标文件中的全局变量和函数名冲突的情况。
  • 重定位:在确定每个符号的最终内存位置后,链接器会更新引用该符号的指令或数据的地址。这涉及到修正相对地址或偏移量,以便正确地访问符号的定义。
  • 通过符号表的合并和重定位,链接器确保在最终生成的可执行文件或库文件中,所有的符号引用都能正确地关联到符号定义的内存位置上。

c++函数名在符号表中是经过修饰的,通过函数名,参数种类,参数数目
共同命名,而c语言在符号表中的命名只和函数名有关。

当出现函数重载时,编译器无法分布两个函数的区别

简单来说:
c++在进行链接的时候,符号表中的函数名会根据参数名发生变化,而c语言只通过函数名命名

综上所述,可以发现一个问题
c++与c语言 在符号表中函数的命名存在差异
当两个语言的文件混合使用时,难免会出现一些问题
可以通过extern “C”来处理

extern “C”

在函数前加extern “C”,意思是告诉编译器,将该函数按照C语言规则来编译。

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

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

相关文章

如何在Microsoft Excel中移动列的位置

若要在 Excel 中移动列,请使用 shift 键或“插入剪切单元格”。你还可以神奇地更改所有列的顺序。 一、Shift 键 要在不覆盖现有数据的情况下快速移动 Excel 中的列,请按住键盘上的 shift 键。 移动单列: 1、首先,选择一列。 2、将鼠标悬停在所选内容的边界上。此时会出…

建立本地题库

建立试题库文件json 第一步&#xff1a; 按标准格式保存试题到本地,文件名为.json. import json import osimage_path os.path.join(C:\\, Users, 123, PycharmProjects, pythonProject1, test01, imges, jxn_0900.png)# 准备要保存的数据 data [{"id": 1,"…

基于深度学习的高精度动物园动物检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于深度学习的高精度动物园动物&#xff08;水牛、斑马、大象、水豚、海龟、猫、奶牛、鹿、狗、火烈鸟、长颈鹿、捷豹、袋鼠、狮子、鹦鹉、企鹅、犀牛、羊、老虎&#xff09;检测识别系统可用于日常生活中或野外来检测与定位动物园动物&#xff0c;利用深度学…

【Java可执行命令】(五)打包部署工具 jar:深入解析应用程序打包、分发和部署工具jar ~

Java可执行命令详解之jar 1️⃣ 概念2️⃣ 优势和缺点3️⃣ 使用3.1 语法格式&#xff1a;创建jar文件3.1.1 参数&#xff1a;-cf3.1.2 参数&#xff1a;-tf3.1.3 参数&#xff1a;-i3.1.4 参数&#xff1a;-v3.1.5 参数&#xff1a;-e 3.2 运行jar文件 4️⃣ 应用场景5️⃣ 注…

Qt实现电子商城系统

用Qt实现的电子商城系统&#xff1a; 1.功能包括&#xff1a; 1)管理员账户 2)用户管理 3)用户登录 4)商品管理 5)商品出售 6)软件打包 2.商品包括&#xff1a;程序源码、开发教程和程序讲解&#xff1b;也可以根据需求进行功能更改 3.试用链接 链接&#xff1a;https://pan.…

华硕无畏14pro设置指纹登录

正常的流程如下 打开一个文件夹&#xff0c;在左侧找到此电脑&#xff0c;点击右键&#xff0c;找到属性 在搜索框中搜索&#xff1a;设置指纹登录 找到指纹识别&#xff0c;左键点击即可展开&#xff0c;点击&#xff1a;添加手指 点击&#xff1a;开始 输入PIN&#xff08;开…

Oracle Linux 迷途知返

Oracle Linux 6.9 发布了。Oracle 已经宣布发布 Oracle Linux 6 发行版的更新了。 新版本 Oracle Linux 6 Update 9&#xff0c;包括多个已更新的内核&#xff0c;以及两个新的 "Unbreakable Enterprise Kernel" 包和一个 "Red Hat Compatible Kernel" 包…

SAP 后台配置之FM基金管理篇

SAP FM基金管理后台配置及应用 1 二话不说先上后台配置&#xff0c;能跑通为先1.1 基础设置1.1.1 维护财务管理区1.1.2 分配财务管理区1.1.3 激活全局基金管理功能1.1.4 定义全局参数1.1.5 定义编号区间编号并分配1.1.6 创建更改层次变式1.1.3 激活科目分配元素1.1.4 设置允许空…

3 款适合您手机或平板电脑的最佳 Android 和 iOS 修复工具

让我们面对现实&#xff1a;技术不可能总是完美的&#xff0c;您的智能手机也是如此&#xff0c;尽管更容易爱上它。毕竟&#xff0c;它只是一台机器&#xff01; 无论您使用的是 Android 还是 iOS 系统的智能手机或平板电脑&#xff0c;当您第一次带回家时&#xff0c;它都能…

搭建帮助中心需要用到哪些工具

随着企业的发展和客户需求的增加&#xff0c;为了提供更好的客户支持和服务&#xff0c;许多企业决定搭建帮助中心。一个完善的帮助中心可以为客户提供详细的产品信息、常见问题解答和使用指南等&#xff0c;帮助他们快速解决问题并提高客户满意度。在本文中&#xff0c;我们将…

优秀的测试工程师养成记,庸碌四年的点工,“我“要进阶了...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 怎么才能成为优秀…

运动耳机哪种戴着舒服、值得推荐的五款运动耳机

在运动中享受最佳声音和舒适感受。这些耳机不仅具备防汗、抗水、稳定舒适的特点&#xff0c;而且还拥有出色的音质和智能功能&#xff0c;帮助你充分释放潜能&#xff0c;突破自我。无论你是专业运动员还是热爱户外活动的人&#xff0c;这些运动耳机将成为你的最佳伙伴&#xf…

Spring AOP 源码探索 之 链式调用中的 ExposeInvocationInterceptor拦截器作用

文章目录 ExposeInvocationInterceptor 示例代码源码分析 extendAdvisorsmakeAdvisorChainAspectJCapableIfNecessary添加扩展拦截器的调用链作用示例总结相关学习路线 JAVA资深架构师成长路线->开源框架解读->Spring框架源码解读 ExposeInvocationInterceptor 从英文名字…

【Linux系列P5】gccg++与【动静态库】的美妙邂逅

前言 大家好吖&#xff0c;欢迎来到 YY 滴 Linux系列 &#xff0c;热烈欢迎&#xff01;本章主要内容面向接触过Linux的老铁&#xff0c;主要内容含 欢迎订阅 YY 滴Linux专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; 订阅专栏阅读&#xff1a;YY的《…

exe的python文件打包

【步骤01】 【在命令行中用pip工具安装Pyinstaller模块】 pip install Pyinstaller 步骤02】 【切换命令行的路径到你要打包的Python源文件的文件夹路径下】 【下面是我要打包的Python源文件&#xff08;散点坐标图.py&#xff09;及其文件夹路径】 【步骤03】 【执行Pyi…

js使用replace保留两位小数,正则保留小数位,输入负数和小数正则自动校验

下面是方法,支持保留自定义小数位&#xff0c;这里使用的是截取&#xff0c;没有四舍五入&#xff0c;我的功能需求是只有两位小数的地方可以输入负数&#xff0c;所以只加在了num2的代码块里&#xff0c;如果你们需要所有数字都进行负号校验&#xff0c;可以吧if (isF)判断放在…

百度智驾,与车路协同说「再见」

作者 | 魏启扬 来源 | 洞见新研社 在经历了裁员&#xff0c;全员停发年终奖之后&#xff0c;百度对智能交通事业部&#xff08;ACE&#xff09;的治理还在继续。 不久前&#xff0c;有媒体爆料称&#xff0c;百度已经将智能交通事业部&#xff08;ACE&#xff09;从原来的智能…

smart Java——Netty实战(下):开发一个仿WeChat聊天工具SmartChat

文章目录 〇、代码逻辑一、搭建Server1.引入依赖2.搭建一个简单的Server 二、搭建WebSocket建立连接1.修改Server&#xff0c;增加一些支持2.自定义一个WebSocketHandler 三、功能实现——用户注册上线1.先定义一个工具类Result&#xff0c;用于封装服务端返回消息2.封装客户端…

easyX库图像处理相关函数(注释版)

0.图像处理相关函数与类型概览 您好&#xff0c;这里是limou3434&#xff0c;本次我将给您带来的是easyX的图像处理相关接口。 如果您感兴趣也可以看看我的其他内容。 函数或数据类型描述IMAGE保存图像的对象。loadimage读取图片文件。putimage在当前绘图设备上绘制指定图像…

高压线路距离保护程序逻辑原理(三)

阻抗元件的主要程序功能是阻抗计算&#xff0c;即第二章的解微分方程算法。配合低通数字滤波器计算出故障点至保护安装处的感受电抗X和电阻R值&#xff0c;再同整定值比较以确定是否在区内。阻抗元件也可以采用其他算法计算阻抗&#xff0c;但应指出上述哪种计算感受电抗和电阻…