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

函数重载

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

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

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

例:

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

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

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

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

名字修饰

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

  1. 预处理阶段(在预处理阶段,会进行宏替换,条件编译,头文件展开,去店掉注释)
  2. 编译阶段(在编译阶段,首先会进行语法语义检错,无误后要将我们写好的C文件编译成汇编文件)
  3. 汇编阶段(在汇编阶段就是要将我们的汇编文件转换成可执行的机器指令)
  4. 链接阶段(在链接阶段就是要把我们的所有的目标文件以及我们所依赖的库文件链接到一起生成可执行程序)
    以上就是我们一个程序的执行过程,我们可以看到,在链接文件的时候,假如我们写了一个重载函数add,那么我们的重载函数在我们的C++底层中是如何处理的?很容易想到,在编译过程中,编译器会将我们的代码编译成汇编文件,这里其实就存在这一种重命名机制,我们把它就叫做名字修饰。

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

  • C++能否按照C语言的方式来编译文件
    答案是肯定可以的,只需要在我们的函数前加上 extern ”C“ 即可。例如
extern "C" int add(int a,int b){
	return a + b;
}

猜你喜欢

转载自blog.csdn.net/qq_43503315/article/details/89714020