在复习C++的基础知识点的时候,遇到了关于写出函数生成的函数符号问题,发现自己C++函数调用约定不清楚,所以打算总结一下,将C++函数的调用约定总结一下,加深一下记忆。
本文的主要内容是学习他人博客总结的结果。
符号生成规则
_cdecl调用约定:“?”+函数名+参数表的开始标识 “@@YA” + 函数返回类型代号+参数类型代号 +结束标识“@Z”或“Z”(无参数)。
_stdcall调用约定:“?”+函数名+参数表的开始标识“@@YG”+函数返回类型代号+参数类型代号 +结束标识“@Z”或“Z”(无参数)。
_fastcal调用约定:“?”+函数名+参数表的开始标识 “@@YI”+ 函数返回类型代号+参数类型代号 +结束标识“@Z”或“Z”(无参数)。
X | D | E | F | H | I | J | K | M | N | _N | U | PA+ | PB+ | ... |
void | char | unsigned char | short | int | unsigned int | long | unsigned long | float | double | bool | struct | 指针+ 类型 | const指针+类型 | ... |
举个例子:
int func(int) // ?func@@YAHH@Z
float func(float) // ?func@@YAMM@Z
_thiscall调用约定(类成员方法的约定):“?” +函数名+ “@”字符引导的类名+参数表的开始标识(函数性质决定)+ 函数返回类型代号+参数类型代号 +结束标识“@Z”或“Z”(无参数)。
参数表的开始标识:公有(public)成员函数的标识“@@QAE”,保护(protected)成员函数的标识“@@IAE”,私有(private)成员函数“@@AAE”;如果使用Const ,则对应的标识“@@QBE”,“@@IBE”,“@@ABE”。
例:
int Test::func(float) // ?func@Test@@AAEHM@Z
int Test::A::func() // ?func@Test::A@@AAEHX@Z