extern"C"的作用:
(1) extern "C"使得在C++中使用C編譯方式成為可能,指明該函數(shù)使用C編譯方式。
(2) 使用extern"C" __declspec(dllexport)聲明導(dǎo)出函數(shù),在DLL中的函數(shù)名字保持與導(dǎo)出函數(shù)名一致。
(3) 使用__declspec(dllexport)聲明導(dǎo)出函數(shù),在DLL中的函數(shù)名字與導(dǎo)出函數(shù)名字不一致,有變化。這些差異主要是使用C方式還是C++方式編譯導(dǎo)致的。
(4) 使用_declspec (dllexport) 時(shí)cpp文件在編譯為OBJ文件時(shí)要對(duì)函數(shù)進(jìn)行重新命名,C語(yǔ)言會(huì)把函數(shù)name重新命名為_(kāi)name,而C++會(huì)重新命名為_(kāi)name@@decoration,在其前面加上extern "C"表示用C語(yǔ)言的方式重命名導(dǎo)出函數(shù)。
(5) 比如一個(gè)C語(yǔ)言源程序A.c要使用C++編寫的庫(kù)函數(shù),在A.c中#include"B.h",其中B.h中有要使用的函數(shù)的原形聲明func。當(dāng)編譯鏈接源程序時(shí),卻發(fā)現(xiàn)了“鏈接錯(cuò)誤,未決的外部符號(hào)...”的錯(cuò)誤,這是什么原因呢?
原因就是,C編譯器編譯A.c時(shí),將func編譯為func,當(dāng)鏈接時(shí)鏈接器去C++庫(kù)中尋找func,但是C++的編譯器在編譯庫(kù)時(shí)將func編譯成_func@yyy@rrr,自然鏈接器就找不著相應(yīng)的函數(shù)的信息了,所以就會(huì)報(bào)錯(cuò)!有什么辦法可以處理這種情況呢?——可以在編寫C++庫(kù)的時(shí)候,為導(dǎo)出函數(shù)加上extern "C",它的含義是告知C++編譯器在編譯這些函數(shù)的時(shí)候,以C編譯器的方式處理函數(shù)名。這樣生成的庫(kù)中的函數(shù)名字就是func了,當(dāng)C程序調(diào)用庫(kù)函數(shù),編譯鏈接時(shí),鏈接器就能找到期望的信息,則鏈接成功。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注