> 文档中心 > 底层刨析C++函数重载

底层刨析C++函数重载


C语言入门篇进阶篇深剖篇都整理在这里了哈。然后这里个人主页,比点头像更好找文章哈。


作者和朋友建立的社区:非科班转码社区-CSDN社区云💖💛💙

期待hxd的支持哈🎉 🎉 🎉


最后是打鸡血环节:改变的确很难,但结果值得冒险,拿出点勇气来。路还很长,现在才刚开始而已。过去无可挽回,未来可以改变。🚀 🚀 🚀 

首先如果不知道函数重载的可以点下面链接哈

https://blog.csdn.net/weixin_62700590/article/details/124488522

然后现在我们知道了什么是函数重载

PS:补充上节内容,C++浮点数打印是保留5位小数,没有5位不会补0,和C不一样哈(6位,会补0)。

为什么C++支持函数重载而C不支持?

因为这里比较底层,所以我们不用VS(IDE),而用Linux。
我们这里先创建一个 f.h,f.cpp,test.cpp 因为我们要实现一个文件调用另外一个文件的内容(比如之前的栈实现队列调用栈)


我们先来回忆一下,一个文件生成可执行程序的过程要经过什么

同时补充符号表:

符号表里面有什么:

1.目标文件中引用的全局变量和函数

2.目标文件中定义的全局变量和函数

本质上符号表表达的内容:

1.我能提供给其他文件使用的符号

2.我需要其他文件提供给我的符号

(编译器在编译过程中遇到的全局变量和函数名都会写进去他们的相关信息)

链接器的作用就是要保证多文件综合时,判断所有目标文件中的符号都有唯一的定义。



经过预处理后,头文件会展开,里面的声明就放出来了 

然后经过编译之后,会检查语法并且生成汇编代码,并且把所遇见的定义了的函数的地址记录下来。然后汇编之后生成 .o 文件 ,里面就有符号表(编译时生成的)


然后重点就来了

先看C++的汇编生成的汇编指令

看左边的圈的部分

这里的_Z作者不知道啥意思哈,后面的1是函数名长度,f是函数名,id(类型首字母PS:整形指针的是Pi)是int和double。也注意!这里没有解释返回类型的指令,这也可以说明为什么C++的返回类型不能作为函数重载条件的原因!

然后我们来看C的汇编生成的汇编指令

我们发现C的汇编指令里面,函数名是没有进行解释的,就是函数原名! 

 所以当同名函数出现的时候,C语言是区分不了的,因为符号表里面会有两个同名的函数名并且附带他们的地址,当链接的时候编译器就不知道哪个才是他的地址。


然后综合C,C++,接着上面的汇编之后,就到了链接,链接会把各文件生成的符号表进行汇总,然后对文件内的函数进行链接,把这些函数的地址对应上。补充一句,如果没有找到函数的地址,就会出现大家熟悉的链接错误。

最后的最后,创作不易,希望读者三连支持💖

赠人玫瑰,手有余香💖