| |
|
开发:
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上的函数名修饰规则比较 清晰 目录 一、准备工作在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语言常见错误合集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |