C++函数名称的修饰规则

C++函数名称修饰规则

int Add(const int a; const int b)
{

return a+b;

}

long Add(const long a,const long b )
{

 return a+b;

}
double Add(const double a, const double b)
{

 return a+b;

}

在函数重载中就提到过,上面两个函数同时出现在C环境下会编译出错
这里写图片描述

但是在C++环境中不会出错,
这里写图片描述

这就是与函数名称的修饰规则有关了

在C环境中,默认调用约定为_cdecl,编辑器此时对函数名的修饰就是在函数名称前面加上下划线,这三个函数名相同的函数修饰成功之后都为_Add,所以就形成了函数的重定义。

而在C++环境中,函数名称的修饰有些复杂,但是信息更加充分,比如我在上面写到的 double Add(double a, double b) , 在C++环境中就被修饰为?Add@@YANNN@Z,这其中就包含了函数名,参数类型,参数个数,调用方式等等

参数列表代号如下:
X–void    
D–char    
E–unsigned char    
F–short    
H–int    
I–unsigned int    
J–long    
K–unsigned long(DWORD) 
M–float    
N–double
_N–bool
U–struct
….
可以看到N是代表double类型,那么 (?add@@YANNN@Z)就能理解了,函数修饰符?,接着是函数名字,@表示函数名结束,然后是_cdecl约定的开始标示符@YA,然后连着的是返回值类型,参数列表的参数类型刚好是double,那么double add(double a,double b)就是NNN,参数表后以“@”标识参数列表的结束,然后以“Z”表示整个的结束,如果该函数无参数,则以“Z”标识结束。

还有在C++中的成员函数中公有和私有的成员函数的修饰也有相应的表示符。总而言之,在C++环境中的函数名修饰的时候,会带有参数列表的信息,还有返回值的信息,所以在C++中的函数重载就是允许存在的,因为它可以根据你的参数列表选择对应的函数,而显然在我们的C环境下是不允许的。

束。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值