函数名字修饰(Decorated Name)方式
函数的名字修饰(Decorated Name)就是编译器在编译期间创建的一个字符串,用来指明函数的定义或原型。LINK程序或其他工具有时需要指定函数的名字修饰来定位函数的正确位置。 多数情况下程序员并不需要知道函数的名字修饰,LINK程序或其他工具会自动区分他们。当然,在某些情况下需要指定函数的名字修饰,例如在C++程序中, 为了让LINK程序或其他工具能够匹配到正确的函数名字,就必须为重载函数和一些特殊的函数(如构造函数和析构函数)指定名字装饰。另一种需要指定函数的 名字修饰的情况是在汇编程序中调用C或C++的函数。如果函数名字,调用约定,返回值类型或函数参数有任何改变,原来的名字修饰就不再有效,必须指定新的 名字修饰。C和C++程序的函数在内部使用不同的名字修饰方式。
函数在符号文件中的修饰:
int Function1 (char *var1,unsigned long);
其函数修饰名为“?Function1@@YGHPADK@Z”。
如果调用别写的动态链接库,如果我们修改了该函数在头文件中的函数参数的类型,那么会引起LINK错误.
static POdxPdx load(LPCSTR szPdx,PDebugStream pLog,IOdxLoadCB *pOLCB);
DLL的lib文件定义:
typedef class CDebugStream *PDebugStream;
如果我们修改成 typedef PVOID pDebugStream.
那么编译器编译头文件,链接时去DLL的lib文件里面查找,会出现load函数未定义。