C++ 编译器的函数名修饰规则函数名字修饰(Decorated Name)方式函数的名字修饰(Decorated Name)就是编译器在编译期间创建的一个字符串,用来指明函数的定义或原型。LINK 程序或其他工具有时需要指定函数的名字修饰来定位函数的正确位置。多数情况下程序员并不需要知道函数的名字修饰,LINK 程序或其他工具会自动区分他们。当然,在某些情况下需要指定函数的名字修饰,例如在C++程序中,为了让 LINK 程序或其他工具能够匹配到正确的函数名字,就必须为重载函数和一些特殊的函数(如构造函数和析构函数)指定名字装饰。另一种需要指定函数的名字修饰的情况是在汇编程序中调用C或 C++的函数。如果函数名字,调用约定,返回值类型或函数参数有任何改变,原来的名字修饰就不再有效,必须指定新的名字修饰。C 和 C++程序的函数在内部使用不同的名字修饰方式,下面将分别介绍这两种方式。1. C 编译器的函数名修饰规则对于__stdcall 调用约定,编译器和链接器会在输出函数名前加上一个下划线前缀,函数名后面加上一个“@”符号和其参数的字节数,例如 _functionname@number。__cdecl 调用约定仅在输出函数名前加上一个下划线前缀,例如_functionname。 __fastcall 调用约定在输出函数名前加上一个“@”符号,后面也是一个“@”符号和其参数的字节数,例如@functionname@number2. C++编译器的函数名修饰规则C++的函数名修饰规则有些复杂,但是信息更充分,通过分析修饰名不仅能够知道函数的调用方式,返回值类型,参数个数甚至参数类型。不管 __cdecl,__fastcall 还是__stdcall 调用方式,函数修饰都是以一个“?”开始,后面紧跟函数的名字,再后面是参数表的开始标识和按照参数类型代号拼出的参数表。对于__stdcall 方式,参数表的开始标识是“@@YG”,对于__cdecl 方式则是“@@YA”,对于 __fastcall 方式则是“@@YI”。参数表的拼写代号如下所示:X--voidD--charE--unsigned charF--shortH--intI--unsigned intJ--longK--unsigned long(DWORD)M--floatN--double_N--boolU--struct....指针的方式有些特别,用PA 表示指针,用PB 表示 const 类型的指针。后面的代号表明指针类型,如果相同类型的指针连续出现,以“0”代替,一个“0”代表一次重复。U 表示结构类型,通常后跟结构体的类型名,用“@@”表示结构类型名的结束。函数的返回值不作特殊处理,它的描述方式和函数参数一样,紧跟着参数表的开始标志,也就是...