因为存在“函数名修饰”。
公司主营业务:成都网站建设、网站设计、移动网站开发等业务。帮助企业客户真正实现互联网宣传,提高企业的竞争能力。创新互联建站是一支青春激扬、勤奋敬业、活力青春激扬、勤奋敬业、活力澎湃、和谐高效的团队。公司秉承以“开放、自由、严谨、自律”为核心的企业文化,感谢他们对我们的高要求,感谢他们从不同领域给我们带来的挑战,让我们激情的团队有机会用头脑与智慧不断的给客户带来惊喜。创新互联建站推出锡山免费做网站回馈大家。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语言在编译过程中,不会对函数名进行任何改变,写的是什么符号他在编译的时候就用什么,链接的时候也就用什么符号,所以,如果有同名函数就会出现冲突和二义性,不支持函数重载。
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧