C名称修饰规则
1.对于使用__cdecl调用约定的函数,在函数名称前加一下划线,不考虑参数和返回值。
2.对于使用__fastcall调用约定的函数,在函数名称前后各加一@符号,后跟参数的长度,不考虑返回值。
例如 extern “C” int __fastcall Test(int n)的修饰名称为@Test@4.
3.对于使用 __stdcall 标准调用约定的函数,在函数名称前加一下划线,名称后加一@符号,后跟参数的长度,不考虑返回值。
例如 extern “C” int __stdcall Test(int n,int m)的修饰名称为 _Test@8
C++名称修饰组成部分
C++名称修饰组成规律
一:都是以?开始,以字符Z结束,中间由@符号分割为多个部分。整个名称的长度最长为2048个字节。
二:对于类的函数,其基本结构为:?方法名@类名@@调用约定 返回类型 参数列表 Z。
三:对于不属于任何类的函数,其基本结构: ?函数名@@Y调用约定 返回类型 参数列表Z。
例如:
Int __cdecl TestFunc(int ,int ) 修饰名称为?TestFunc@@YAHHH@Z
@Y表明不是类的方法
A代表调用约定 __cdecl
一个H代表返回值为整数类型,后两个H代表两个整型参数
Public int CTest::SetName(char*,…) 修饰名称为 ?SetName@CTest@@QAAHPADZZ
?是前缀
SetSetName是方法名
CTest是类名
@Q表示类名结束
第一个A为C++方法的调用约定前缀,后面的A表示C调用约定(因为声明中包含可变数量参数,所以编译器会自动使用_cdecl)。
H表示返回值类型(整数)
PAD为参数编码,Z是后缀
再例如构造函数
Public : CTest::CTest(void),修饰名称为 ??0CTest@@QAE@XZ
?0 代表构造函数
CTest 表示类名
@Q 表示类名结束
AE 表示this 调用约定
例如运算符重载:
public :void CTest::operator delete (void*) 修饰名称为??3CTest@@SAXPAX@Z
@S表示重载delete 运算符被自动编译成静态方法,重载new 也是如此。