从底层挖掘——为什么C语言不支持函数重载C++却可以

目录

一、函数重载

二、编译+链接

2.1预处理

1.展开头文件

 2.删除注释

3.#define定义的符号的替换

2.2编译

1.将C语言代码转换为汇编代码

2.语法分析

3.词法分析

4.语义分析

                  5.符号汇总

重点:

2.3汇编

1.将汇编代码转换为二进制指令

2. 形成符号表

2.4链接

1.合并段表

2.符号表的合并和重定位

三、总结


希望这篇文章对你有帮助。

一、函数重载

C++允许在同一范围中声明几个功能类似的同名函数

例如:

int  Add(int a, int b)
{
	return a + b;
}

double Add(int a, double b)
{
	return a + b;
}

函数重载必须在下列一个或两个方面有所区别:

1、函数参数个数不同

2、函数参数类型不同

3、函数参数顺序不同

二、编译+链接

想要了解函数重载,就要首先了解编译的过程

我们首先建立

这两个项目其中Add.cpp中包含两个重载函数分别是

int  Add(int a, int b)
double Add(int a, double b)

test.cpp 中含有调用add函数的主函数。go.h存放函数的声明。

要把test.cpp变成可执行程序test.exe要进行以下步骤:

直观点呢,就是这样

咋们接下来细细讲讲每一步,至于函数重载的知识看官别急,我们来循序渐进的一步步探索 

2.1预处理

1.展开头文件

库中的内容会被展开

就如这样

 2.删除注释

这句话在预处理时会被删掉

3.#define定义的符号的替换

例如:

其中MAX会被替换为1000

2.2编译

1.将C语言代码转换为汇编代码

其中部分就是汇编代码

2.语法分析

3.词法分析

4.语义分析

这以上都是在检查语法的正确性。

5.符号汇总

 我们将这种具有全局性的符号进行汇总.

这一步是在为下一步做准备

总之,就是检查的你的语法问题,如果你在在线OJ时,报错是编译错误,有可能是你的语法出了问题。

2.3汇编

1.将汇编代码转换为二进制指令

二进制指令专门为CPU服务,CPU来依照执行。

2. 形成符号表

这是重点,我们重点来讲下。 

这时我们就要形成符号表

 这里看客会有疑问两个Add函数怎么对应相应的所调用的函数呢?

我们继续往下看

2.4链接

1.合并段表

2.符号表的合并和重定位

这时:

符号表开始汇总:

c语言背景下

这时错误出现了

究竟是哪个Add对应哪个地址呢??????

 

 这就是C的缺点所在,我们在调用时,通过汇编代码可以看到


                      通过call来依据地址找寻所调用的函数,地址不明确,链接报错,程序出了问题

所以C支持不了函数重载

 让我们来看看C++是怎么做的

C++中Add函数不单纯摆在那里就叫Add

它会依据函数的名称和参数来修饰函数名字

如:

这个原函数是

int f(double a , int b)

在gcc的编译环境下,我们看到这个函数被命名为 _Z1fdi

我们依据我们的Add函数来命名下

int  Add(int a, int b)
double Add(int a, double b)

如此就是:

 这样就简单了,我们回到符号表汇总那一步骤

两个Add函数地址会被对应的地址覆盖,并在使用时被找到对应的函数

  这样函数调用时就会按地址索骥

这样函数重载就可以使用了!

三、总结

C++中把函数的名字在符号表汇总时进行了函数名修饰,重载函数之间有不同的参数的区别,这时可以通过这种修饰来更好的寻找对应的函数地址,从而可以函数重载。

而C就傻傻的将函数名字原封不动地停留在原地,以至于有多个重载函数(函数名相同)会找不到对应的地址,以至于不能函数重载。

 谢谢观看,如有错误请指出哈,如有帮助请点个赞喔。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值