C++ 编译器的函数名修饰规则函数名字修饰(Decorated Name)方式函数的名字修饰(Decorated Name)就是编译器在编译期间创建的一个字符串,用来指明函数的定义或原型
LINK 程序或其他工具有时需要指定函数的名字修饰来定位函数的正确位置
多数情况下程序员并不需要知道函数的名字修饰,LINK 程序或其他工具会自动区分他们
当然,在某些情况下需要指定函数的名字修饰,例如在C++程序中,为了让 LINK 程序或其他工具能够匹配到正确的函数名字,就必须为重载函数和一些特殊的函数(如构造函数和析构函数)指定名字装饰
另一种需要指定函数的名字修饰的情况是在汇编程序中调用C或 C++的函数
如果函数名字,调用约定,返回值类型或函数参数有任何改变,原来的名字修饰就不再有效,必须指定新的名字修饰
C 和 C++程序的函数在内部使用不同的名字修饰方式,下面将分别介绍这两种方式
C 编译器的函数名修饰规则对于__stdcall 调用约定,编译器和链接器会在输出函数名前加上一个下划线前缀,函数名后面加上一个“@”符号和其参数的字节数,例如 _functionname@number
__cdecl 调用约定仅在输出函数名前加上一个下划线前缀,例如_functionname
__fastcall 调用约定在输出函数名前加上一个“@”符号,后面也是一个“@”符号和其参数的字节数,例如@functionname@number2
C++编译器的函数名修饰规则C++的函数名修饰规则有些复杂,但是信息更充分,通过分析修饰名不仅能够知道函数的调用方式,返回值类型,参数个数甚至参数类型
不管 __cdecl,__fastcall 还是__stdcall 调用方式,函数修饰都是以一个“
”开始,后面紧跟函数的名字,再后面是参数表的开始标识和按照参数类型代号拼出的参数表
对于__stdc