| |
|
开发:
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++中,一个程序要运行起来,需要经历以下几个阶段:预处理、编译、汇编、链接。 预处理、编译、汇编、链接
【当前a.cpp中调用了b.cpp中定义的Add函数时】 编译后链接前,a.o的目标文件中没有Add的函数地址,因为Add是在b.cpp中定义的,所以Add的地址在b.o中。那么怎么办呢? 链接阶段就是专门处理这种问题,链接器看到a.o调用Add,但是没有Add的地址,就会到b.o的符号表中找Add的地址,然后链接到一起。 【链接时,面对Add函数,连接器会使用哪个名字去找呢?】这里每个编译器都有自己的函数名修饰规则。 由于Windows下vs的修饰规则过于复杂,而Linux下gcc的修饰规则简单易懂,下面我们使用了gcc演示了这个修饰后的名字。
在Linux下,采用g++编译完成后,函数的名字修饰发生变化,编译器将函数参数类型信息加到了修改后的名字中。 【有了函数名修饰规则,只要参数不同,func.o符号表里面重载的函数不存在二义性和冲突】 链接的时候,test.o的main函数里面去调用重载函数,查找地址时,也明确。 【Linux下函数修饰规则】 g++的函数修饰后变成:_Z+函数长度+函数名+类型首字母。 【Windows下名字修饰规则】 符号表里修饰后的函数名不存在二义性和冲突,test.o中main函数在调用重载函数,调用地址时,也不会出现二义。 接下来,看一下vs中重载函数的反汇编过程
进入 最后,可以思考下面4个问题:
|
|
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 11:57:26- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |