“調(diào)用轉(zhuǎn)換”(calling conversion)和“命名轉(zhuǎn)換”(naming conversion)這兩個(gè)概念對(duì)我們來說其實(shí)并不陌生,只要你聽說過extern "C",__cdecl,__stdcall和__fastcall這些東西,如果引用的聲明和導(dǎo)出的聲明不一致,就會(huì)出現(xiàn)類似下面這么一個(gè)編譯錯(cuò)誤:
RealTest.obj : error LNK2001: unresolved external symbol "double __stdcall Fun1(int,double)" (?Fun1@@YGNHN@Z)
Debug/RealTest.exe : fatal error LNK1120: 1 unresolved externals
解決這個(gè)問題很簡(jiǎn)單,只要使用一致的聲明就可以了。我們用C++編程,常接觸到的也就兩種命名轉(zhuǎn)換,一種是C++的,不需要特別聲明,一種是C的,需要加上個(gè)extern "C"前綴;而調(diào)用轉(zhuǎn)換有三種,__cdecl,__stdcall和__fastcall,調(diào)用轉(zhuǎn)換不同,導(dǎo)出的符號(hào)也是有差別的。這里我就不深究它們的差別了,我們所要記住的就是:保持一致。
RealTest.obj : error LNK2001: unresolved external symbol "double __stdcall Fun1(int,double)" (?Fun1@@YGNHN@Z)
Debug/RealTest.exe : fatal error LNK1120: 1 unresolved externals
解決這個(gè)問題很簡(jiǎn)單,只要使用一致的聲明就可以了。我們用C++編程,常接觸到的也就兩種命名轉(zhuǎn)換,一種是C++的,不需要特別聲明,一種是C的,需要加上個(gè)extern "C"前綴;而調(diào)用轉(zhuǎn)換有三種,__cdecl,__stdcall和__fastcall,調(diào)用轉(zhuǎn)換不同,導(dǎo)出的符號(hào)也是有差別的。這里我就不深究它們的差別了,我們所要記住的就是:保持一致。