C的名称修饰规则
1. 对于使用C调用协议(__cdecl)的函数,在函数名称前加一下划线,不考虑参数和返回值
2. 对于使用快速调用协议(__fastcall)的函数,在函数名称前后各加一@符号,后跟参数的长度,不考虑返回值。例如extern "C" int __fastcall Test(int n)的修饰名称为@Test@4
3. 对于使用标准调用协议(__stdcall)d的函数,在函数名称前加一下划线,名称后加一@符号,后跟参数的长度,不考试返回返回值extern "C" int __stdcall Test(int a, int b)的修饰名称为_Test@8
C++名称修饰规则
1. 都是以?开始,以字符Z结束,中间由@符号分割为多个部分。整个名称最长为2048(遇到模板展开时,名称会非常长)
2. 对于类的函数,基本结构为:?方法名@类名@@调用协议 返回类型 参数列表 Z
3. 对于不属于任何类的函数,其基本结构为:?函数名@@Y 调用协议 返回类型 参数列表 Z
4. 类的构造函数和析构函数比较特殊,分别是?0和?1,运算符重载也有特殊的名称,例如new、delete、=、+和++名称分别为?2,?3、?4,?H,?E
5. 如果是类方法,由所属类开始依次加上类名和父类名,每个类名后面加一个@符号,所有类名加好后,在加一个@符号和字符Q或S(静态方法),如果不是类的方法,直接加上@符号和字符Y.
6. 对于不属于任何类的函数,C调用约定代码为A,__fastcall为I,标准调用约定为G,对于类方法,调用协议前加一个字符A,this调用协议为E。
7. 返回值编码:H表示整形
8. 后缀Z
9. 参数列表以@符号结束。
以int __cdecl TestFunc(int, int)为例,它的修饰名为?TestFunc@@YAHHH@Z。其中,@Y表明这不是类的方法,其后的A代表C调用约定,第一个H表示返回值为整数,后两个HH分别代表两个整数参数,之后@表示参数列表结束,最后的Z是后缀