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”。

例子

  1. 对于以下函数:
    int Function1(char*, unsigned char);
    的修饰应当为:?Function1@@YGHPADE@Z
  2. 对于以下函数:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
struct mytype
{
int x, y;
};

class CTest
{
private:
void Function1(int);
protected:
void Function2(const CTest &src);
public:
void Function3(mytype*, int);
};

其中
Function1的修饰应当为:?Function1@CTest@@AAEXH@Z
Function2的修饰应当为:?Function2@CTest@@IAEXABV1@Z
Function3的修饰应当为:?Function3@CTest@@QAEXPAUmytype@@H@Z

结束语

水了一篇,诶嘿~