C++函数名修饰规则
C++函数名修饰规则
这是啥
函数的名字修饰(Decorated Name)就是编译器在编译期间创建的一个字符串。用来指明函数的定义或原型。
修饰规则
C++的修饰规则为“? + 函数名 + 标识符”
标识符的第一部分
标识符的第一部分是调用规则说明:
__cdelc | __fastcall | __stdcall |
---|---|---|
@@YA | @@YI | @@YG |
标识符的第二部分
标识符的第二部分依次是返回值和函数参数的类型:
int | char | void | unsigned int | unsigned char | float | double | bool | struct |
---|---|---|---|---|---|---|---|---|
H | D | X | I | E | M | N | _N | U |
其中如果类型是指针则在标识符前增加PA,如果是const类型的指针则增加PB。
对于结构体则在U后面添加结构体的名称,并以@@结尾。
标识符的第三部分
标识符的第三部分是结束符:
如果函数有参数则以“@Z”结束,否则以“Z”结束。
函数名的第一部分
函数名的第一部分是函数的本名。如果该函数不是类的成员,那么就只有第一部分。
函数名的第二部分
对于类的成员的不同属性有如下规则:
public | protected | private | |
---|---|---|---|
无const | @@QAE | @@IAE | @@AAE |
有const | @@QBE | @@IBE | @@ABE |
同时取消标识符的第一部分。
此时如果参数为类实例引用,则改为“AAV1”,带const改为“ABV1”。
例子
- 对于以下函数:
int Function1(char*, unsigned char);
的修饰应当为:?Function1@@YGHPADE@Z - 对于以下函数:
1 | struct mytype |
其中
Function1的修饰应当为:?Function1@CTest@@AAEXH@Z
Function2的修饰应当为:?Function2@CTest@@IAEXABV1@Z
Function3的修饰应当为:?Function3@CTest@@QAEXPAUmytype@@H@Z
结束语
水了一篇,诶嘿~