IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C语言不支持重载,但C++支持函数重载的原因 -> 正文阅读

[C++知识库]C语言不支持重载,但C++支持函数重载的原因

重载:函数名相同时,参数类型、参数个数、参数顺序,三者任意一者不同即可构成重载

C语言:根据函数名去符号表找函数地址

C++:有自己的修饰规则,能够根据修饰后的函数名映射到地址

程序运行起来需要经过下面几个阶段:

(1)预处理 —— 头文件展开、宏替换(#define)、条件编译(#ifdef)、去除注释(生成 .i 文件)

(2)编译 —— 检查语法,若无误,生成汇编代码(生成 .s 文件)

(3)汇编 —— 汇编代码转换成二进制机器码(生成 .o文件)

(4)链接 —— 生成可执行文件

编译生成汇编代码的过程中,C和C++对函数的处理就体现出来了

下面将在Linux系统上分析,因为Linux上的函数名修饰规则比较 清晰


目录

一、准备工作

二、原理解析

?三、C 测试

(1)单个函数

(2)多个同名函数

四、C++测试

(1)新增重载函数

?(2)程序测试

五、总结


一、准备工作

在Linux中新建func.h 、func.c、test.c文件

?

?编译生成 .out文件(等价于windows下的exe文件)

二、原理解析

经过预处理、汇编、编译生成二进制机器码(.o文件)以后,这个时候,计算机正式开始逐句运行程序(因为计算机只能识别二进制机器码)

生成func.o的时候,会顺带一个符号表

当要调用 func函数的时候,会去根据函数名去符号表中找func函数的地址,找到以后再执行函数体

PS:

(1)call? 是汇编语言中调用函数的指令,存在于.s文件中,这里意为调用func函数

(2)? func(?) —— 调用函数的时候只知道函数名,但不知道函数地址

? ? ? ? ? ? ? ? ? ? ? ? ? ? ?在符号表中找到对应的函数地址以后, ?会被替换为函数地址,如? func(40052d)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

?三、C 测试

(1)单个函数

在Linux命令行输入 objdump -S ./a.out

调用函数时,执行指令 call <func>?

===>C程序调用函数时,直接通过 函数名 去找 函数地址,不考虑参数个数或者参数类型

(2)多个同名函数

假设我们又定义了一个 func(int a) ,

函数调用的时候,都是 call func(?),在符号表中有两个 func ,C 程序不知道要调用哪个函数

所以就会报错

四、C++测试

(1)新增重载函数

我们在原本的基础上新增一个函数

?

?

?(2)程序测试

?我们会发现,汇编使用的函数名,不是一样的!!

C++有自己的名字修饰规则:_Z + 函数名长度 + 函数名 + 形参类型

?call 指令会根据 修饰后的函数名 去符号表找 函数地址,然后通过函数地址链接到对应的函数定义

?找到 函数地址 后,把 ?换掉

五、总结

C语言:根据? 函数名? 去符号表找函数地址

C++:有自己的修饰规则,能够根据? 修饰后的函数名? 映射到地址

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-17 21:52:22  更:2022-03-17 21:53:06 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 2:41:03-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码