C/C++編程筆記:在C++中如何調(diào)用C語(yǔ)言的代碼?你可以這樣做
很多初學(xué)的小萌新,第一反應(yīng)很有可能是:直接調(diào)用就完事了!這樣說(shuō)也沒(méi)錯(cuò),因?yàn)镃++本來(lái)就包含了C。比如在C文件中存在一個(gè)函數(shù)func_c(), 該文件與C++的工程混編在一起時(shí),可以直接在C++中調(diào)用C文件中的func_c();不需要做任何額外處理。

不過(guò)在C中,不可以調(diào)用C++的接口,也不能直接調(diào)用C語(yǔ)言的一些API,否則編譯會(huì)出錯(cuò)。這個(gè)時(shí)候呢,就需要我們今天的主角:extern "C"了!
為什么要是用?extern "C"
在進(jìn)行C++開(kāi)發(fā)的時(shí)候,由于C、C++編譯規(guī)則是不同的。C++編譯函數(shù)方法是使用mangle的技術(shù)。

而在C語(yǔ)言中是沒(méi)有這個(gè)技術(shù)的,所以如果我們想要調(diào)用C語(yǔ)言開(kāi)發(fā)的一些API,就需要使用?extern "C"修飾C語(yǔ)言的函數(shù)聲明。
extern "C"用法
(1)直接在函數(shù)前面加上?extern "C"?關(guān)鍵字
extern "C" void fun() {
printf("test");
}
(2)如果有函數(shù)聲明與函數(shù)實(shí)現(xiàn),要讓函數(shù)聲明被?extern "C"?修飾,函數(shù)實(shí)現(xiàn)可以不修飾
extern "C" void func();
void func() {
cout << "func()" << endl;
}
(3)如果有多個(gè)函數(shù)要被extern "C"?修飾,可以直接用{}包裹
extern "C" {
void func();
void func1();
}
void func() {
cout << "func()" << endl;
}
void func1() {
cout << "func1()" << endl;
}
自定義C語(yǔ)言函數(shù)庫(kù)
但是我們每次使用C語(yǔ)言的API都用這個(gè)extern "C"修飾那是不是太麻煩了,那我們學(xué)會(huì)了怎么去使用extern "C",我們可以在編寫(xiě)C語(yǔ)言API庫(kù)的時(shí)候,直接使用這個(gè)來(lái)修飾,那么C++再去調(diào)用的時(shí)候就不用這么麻煩了,直接使用這個(gè)函數(shù)就可以了。

但是這么定義的話就會(huì)產(chǎn)生另一個(gè)問(wèn)題,那么就是無(wú)法在C語(yǔ)言文件中調(diào)用這個(gè)庫(kù)
因?yàn)樵贑語(yǔ)言中是沒(méi)有extern "C"這個(gè)關(guān)鍵字的。調(diào)用這個(gè)庫(kù),就是直接把這個(gè)庫(kù)的文件代碼拷貝過(guò)來(lái)。例如:

那么我們就需要在定義這個(gè)sum庫(kù)的時(shí)候加上一些約束規(guī)則,讓他在被C++調(diào)用的時(shí)候加上?extern "C"?關(guān)鍵字,在被C語(yǔ)言調(diào)用的時(shí)候去掉這個(gè)關(guān)鍵字。

__cplusplus這個(gè)宏是C++中特有的。它在加載C++文件的時(shí)候會(huì)提前定義這個(gè)宏,所以我們只要判斷文件中是否有這個(gè)宏,有的話就是C++在調(diào)用,沒(méi)有的話就是C語(yǔ)言,這樣就可以很好地解決了這個(gè)混合調(diào)用的問(wèn)題。
希望對(duì)你有幫助!

另外,UP在主頁(yè)上傳了一些學(xué)習(xí)C/C++編程的視頻教程,有興趣或者正在學(xué)習(xí)的小伙伴一定要去看一看哦!會(huì)對(duì)你有幫助的~