为什么c++可以函数重载而c就不可以呢?这就跟函数名修饰规则有关了。
每个编译都有自己的函数名修饰规则,由于windows下的vs修饰规则过复杂,而Linux下的gcc、g++编译器的修饰规则简单易懂。因此下面用gcc、g++来演示过程。
有3个文件,f.h、f.cpp、test.cpp。
f.h 1 #include
2
3 void f(double n1,double n2);
4
5 void f(int n1,int n2);
f.cpp
1 #include"f.h"
2
3 void f(double n1,double n2)
4 {
5 printf("%.2f,%.2f\n",n1,n2);
6 }
7
8 void f(int n1,int n2)
9 {
10 printf("%d ,%d\n",n1,n2);
11 }
test.cpp
1 #include"f.h"
2
3 int main()
4 {
5 f(1.00,2.22);
6
7 return 0;
8 }
因为Linux下文件类型是不看文件后缀来区分的。因此我们分别用gcc、g++来编译这3个文件看看能不能通过。(gcc是Linux下的c语言编译器,g++是LInux下的c++编译器)
用gcc出现了编译错误函数名冲突,而用g++则通过了并且生成了一个a.out。
编译的时候会符号汇总,汇编的时候会生成符号表。这其中就有它自己的修饰名规则。先来看看gcc下是怎么样的。gcc下的函数名修饰是不变的,跟定义的函数名一样。
g++的就截然不同了,经过修饰后变成【_Z+函数名长度+函数名+参数类型的首字母】
看到这些就能理解c语言没办法支持函数重载了,因为同名函数是没办法区分的。而c++是通过函数修饰规则来区分,只要参数不同修试出来的名字就不一样,所以就支持重载。另外也理解到函数重载要求参数类型不同,而不去要求返回值类型。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)