【C++入门】你知道为什么C++支持函数重载而C语言不支持吗?

在这里插入图片描述

个人主页:@Weraphael
✍作者简介:目前学习C++和算法
✈️专栏:C++航路
希望大家多多支持,咱一起进步!
如果文章对你有帮助的话
欢迎 评论 点赞 收藏 加关注✨


前言

本章是补充C语言语法的不足,以及C++是如何对C语言设计不合理的地方进行优化的。

目录

  • 前言
  • 一、函数重载的概念
  • 二、例举重载函数
  • 三、分析为什么C++支持函数重载而C语言不支持
  • 四、总结

一、函数重载的概念

C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的 形参列表(参数个数、类型或者类型顺序)不同返回值没有要求。常用来处理实现功能类似数据类型不同的问题

二、例举重载函数

  • 参数类型不同

【C++入门】你知道为什么C++支持函数重载而C语言不支持吗?_第1张图片

周所周知,C语言是不允许出现同名函数;而C++中的函数重载就可以来处理实现功能类似数据类型不同的问题

  • 参数个数不同

【C++入门】你知道为什么C++支持函数重载而C语言不支持吗?_第2张图片

再来看看以下代码:

【C++入门】你知道为什么C++支持函数重载而C语言不支持吗?_第3张图片

首先以上代码构成重载,只是存在函数func()的调用存在歧义。因为func()可以调用void func(),也可以调用缺省参数void func(int a = 1),对于缺省参数,如果没有传参,默认使用缺省参数值。

  • 参数类型顺序不同

【C++入门】你知道为什么C++支持函数重载而C语言不支持吗?_第4张图片

  • 与函数的返回类型无关

【C++入门】你知道为什么C++支持函数重载而C语言不支持吗?_第5张图片

三、分析为什么C++支持函数重载而C语言不支持

为什么C++可以函数重载而C就不可以呢?这就跟 函数名修饰规则 有关了。

由于vs修饰规则过复杂,而Linux下的gccg++编译器的修饰规则简单易懂。因此下面用gccg++来演示过程。(gccLinux下的c语言编译器,g++LInux下的C++编译器)

  1. 首先在Linux下编写test.c,其内容如下:
vim test.c

【C++入门】你知道为什么C++支持函数重载而C语言不支持吗?_第6张图片

  1. 首先用gcc来编译test.c文件(gccLinux下的C语言编译器)

【C++入门】你知道为什么C++支持函数重载而C语言不支持吗?_第7张图片
果然在我们的预料中,C语言环境下发生了编译错误。接下来我们可以使用objdump(反汇编)来查看目标文件或者可执行的目标文件的构成。为了能让文件编译通过,我们修改文件内容如下:

【C++入门】你知道为什么C++支持函数重载而C语言不支持吗?_第8张图片

紧接着用gcc编译test.c文件,生成了a.out的可执行文件,然后再用objdump -S a.out来查看目标文件或者可执行的目标文件的构成

【C++入门】你知道为什么C++支持函数重载而C语言不支持吗?_第9张图片

如下图所示,C语言函数名的存储是直接转化使用函数名,所以不支持函数重载

【C++入门】你知道为什么C++支持函数重载而C语言不支持吗?_第10张图片

  1. 然后再用g++来编译先前的test.c文件(函数重载),我们发现是可以编译的过的,生成了a.out

在这里插入图片描述

最后,再用objdump -S a.out来查看目标文件或者可执行的目标文件的构成,如下图所示
【C++入门】你知道为什么C++支持函数重载而C语言不支持吗?_第11张图片

如上图,C++会因为函数名修饰规则,函数名的存储格式为:_Z + 函数名长度 + 函数名 + 参数类型的首字母。所以,只要形参列表(参数个数或类型或顺序) 不同,函数名的存储也就不同。那么在链接时,就不会因函数名的冲突而找不到对应地址。因此,C++是支持函数重载的

四、总结

  1. 函数重载需要满足参数个数、类型或者类型顺序不同,注意:其返回值没有要求。
  2. C语言不支持就是因为直接转化函数名,C++支持是因为函数名修饰规则

你可能感兴趣的:(C++,c++,c语言,开发语言,笔记,学习)