C++ 为什么能够函数重载?

一、为什么?

        因为存在“函数名修饰”。       

        c++编译时候与c语言几乎相同,都是通过函数名去查找,有一点不同的是c语言没有函数名修饰这个概念,所以c语言是直接拿着函数名去查找,此时如果有两个相同的函数名的话,那就产生了二义性,但是c++的出现产生了“函数名修饰”这个概念。

        函数名修饰就是把函数名按照特定的规则对其进行修饰,使得相同名字、参数不同(也就是函数重载的三大条件:形参的个数,顺序,类型不同)的函数在编译的时候能拥有不同的名字和地址,这样在链接的时候就不会产生二义性和冲突。

        

        如上,我在test.c 文件中写了两个能够构成重载的函数 f() 和 f(int a, int* p) (参数的个数、顺序、类型均不同,但是函数名相同)。

        可以看出是可以正常运行的。 

二、怎么运行的?

        接下来我们看看g++是怎么进行编译的:

        使用指令进行反汇编:

objdump -S a.out


         可以清晰地看出三个函数的名字分别是:_Z1fv(4006a8),_Z1fipi(4006b8),_Z4funciPi(40068d)

        所以在g++编译器中,函数名修饰规则便为:_Z + 函数名长度 + 函数名 + 形参类型首字母。

        如此便可构成函数重载。

        那么c语言呢?

        使用gcc编译器试一下:

 

         对比可以发现,c语言在编译过程中,不会对函数名进行任何改变,写的是什么符号他在编译的时候就用什么,链接的时候也就用什么符号,所以,如果有同名函数就会出现冲突和二义性,不支持函数重载。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值