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

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

        每个编译都有自己的函数名修饰规则,由于windows下的vs修饰规则过复杂,而Linux下的gcc、g++编译器的修饰规则简单易懂。因此下面用gcc、g++来演示过程。

        有3个文件,f.h、f.cpp、test.cpp。

f.h

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值