概述
前段时间整理了函数的调用约定,顺便说了C编译器下的函数名修饰规则,其中漏掉了C++中函数名的修饰规则,今天就给补上。
1、函数名字修饰的意义
函数的名字修饰就是编译器在编译期间创建的一个字符串,用来指明函数的定义或原型。链接程序或其他工具有时需要指定函数的名字修饰来定位函数的正确位置。(链接问题后面再整理)
多数情况下程序员并不需要知道函数的名字修饰,链接程序或其他工具会自动区分他们。当然,在某些情况下需要指定函数的名字修饰,例如在C++程序中, 为了让链接程序或其他工具能够匹配到正确的函数名字,就必须为重载函数和一些特殊的函数(如构造函数和析构函数)指定名字装饰。另一种需要指定函数的名字修饰的情况是在汇编程序中调用C或C++的函数。如果函数名字,调用约定,返回值类型或函数参数有任何改变,原来的名字修饰就不再有效,必须指定新的名字修饰。
2、C++编译器的函数名修饰规则
C++的函数名修饰规则有些复杂,但是信息更充分,通过分析修饰名不仅能够知道函数的调用方式,返回值类型,参数个数甚至参数类型。
对于非成员函数,不管 __cdecl,__fastcall还是__stdcall调用方式,函数修饰都是以一个“?”开始,后面紧跟函数的名字,再后面是参数表的开始标识和 按照参数类型代号拼出的参数表。
参数表的拼写代号如下所示:
X -- void
D -- char
E -- unsigned char
F -- short
H -- int
I -- unsigned int
J -- long
K -- unsigned long(DWORD)
M -- float
N -- double
_N -- bool
U -- struct
PA -- 指针
PB -- const类型的指针
指针的方式有些特别,后面的代号表明指针类型,如果相同类型的指针连续出现,以“0”代替,一 个“0”代表一次重复。
U表示结构类型,通常后跟结构