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环境下是不允许的。
束。