C语言为什么不支持函数重载

函数重载

在我们中国的文化中,一个词可能是有多种含义,在这种情况下就可以通过上下文来判断这个词到底是什么意思,在这里我们就可以理解为这个词被重载了。
例:又是晴朗的而又美好的一天,可是小明的妈妈却让小明去打扫卫生,不打扫完不能出去玩,但是恰好小明这时候特别想出去和朋友一起打篮球,当她妈妈给他让他去打扫卫生时,小明顺口来了一句“ 我去 ”。那么请问小明到底是去还是不去。其实这只是个玩笑而已,不过它却很像我们的函数重载,下面就让我们一起来看什么是函数重载吧!

1、什么是函数重载?

在我们C++中,允许我们在同一作用域中声明同名的函数,这些同名的函数的形参列表不同就是我们的函数重载。
形参列表(形参变量个数不同,形参变量类型不同,形参变量顺序不同)

在这里我们要注意一点,函数的返回值不同不构成函数重载

例:

  • 整数相加函数
int add(int a,int b)
{
	return a + b;
}
  • 浮点数相加函数
double add(double a, double b)
{
	return a + b;
}

形如上面两种写法的函数就是函数的重载,第一个函数是用来计算两个整数相加的,第二个函数是用来计算浮点数相加的,两个函数的形参类型不同,所以这就构成了add函数的重载

2、为什么要有函数重载?

  • 试想如果没有函数重载机制,如在C中,假如我们要打印一些数据,你必须要这样去做:为这个print函数取不同的名字,如print_int、print_string。这里还只是两个的情况,如果是很多个的话,就需要为实现同一个功能的函数取很多个名字,如加入打印long型、char*、各种类型的数组等等。这样做很不友好!
  • 类的构造函数跟类名相同,也就是说:构造函数都同名。如果没有函数重载机制,要想实例化不同的对象,那是相当的麻烦!
  • 操作符重载,本质上就是函数重载,它大大丰富了已有操作符的含义,方便使用,如+可用于连接字符串等!

既然我们知道了什么是函数重载,那么C++支持函数重载,那么C语言为什么不支持函数重载呢?接下来就让我们一起去探究一下函数的底层调用过程。

二、名字修饰

通过我们在写好一个.c/.cpp文件的时候,点击开始运行,那么它就能运行起来,运行一个程序就这一步就好了吗?其实当然不是,下面让我们来看看我们C/C++中我们的程序到底是如何运行起来的。大致可以分为4个阶段,如下:

  1. 预处理阶段(在预处理阶段,会进行宏替换,条件编译,头文件展开,去掉注释)
  2. 编译阶段(在编译阶段,首先会进行语法语义检错,无误后要将我们写好的C文件编译成汇编文件)
  3. 汇编阶段(在汇编阶段就是要将我们的汇编文件转换成可执行的机器指令)
  4. 链接阶段(在链接阶段就是要把我们的所有的目标文件以及我们所依赖的库文件链接到一起生成可执行程序)

以上就是我们一个程序的执行过程,我们可以看到,在链接文件的时候,假如我们写了一个重载函数add,那么我们的重载函数在我们的C++底层中是如何处理的?很容易想到,在编译过程中,编译器会将我们的代码编译成汇编文件,这里其实就存在这一种重命名机制,我们把它就叫做名字修饰

名字修饰内容

  • 在C语言中,编译器在编译过程会将我们的函数重命名,具体的方法就是在我们的函数名前加上“_“修饰符,通过这种方式就可以在我们的符号表种查找到了,但是假如有两个相同的函数,编译之后进行相同的重命名,在符号表中生成的函数名一样,那么就无法区分到底是哪个函数了,所以这也就是我们的C语言为什么不支持函数重载的原因了。
  • 在C++中,既然支持函数重载,那么它肯定对C语言在这方面进行了优化,具体的方法就是在我们的函数名后面加上参数然后生成我们符号表中的函数名称。那么这样一来,就很容易理解了,为什么C++可以支持函数重载了,就是因为函数重载底层的原理造成的,就是由于重载函数在符号表中生成的函数名称不一样,这样就能区分到底是哪个函数了。这样一来编译就能通过了。

C++能否按照C语言的方式来编译文件?

答案是肯定可以的,只需要在我们的函数前加上 extern ”C“ 即可。例如:

extern "C" int add(int a,int b)
{
	return a + b;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值