c++为什么支持函数重载,而c却不支持

c++为什么支持函数重载,而c却不支持,第1张

        为什么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++是通过函数修饰规则来区分,只要参数不同修试出来的名字就不一样,所以就支持重载。另外也理解到函数重载要求参数类型不同,而不去要求返回值类型。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1353404.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-14
下一篇 2022-06-14

发表评论

登录后才能评论

评论列表(0条)

保存