很多初學的小萌新,第一反應很有可能是:直接調用就完事了!這樣說也沒錯,因為C 本來就包含了C。比如在C文件中存在一個函數func_c(), 該文件與C 的工程混編在一起時,可以直接在C 中調用C文件中的func_c();不需要做任何額外處理。
不過在C中,不可以調用C 的接口,也不能直接調用C語言的一些API,否則編譯會出錯。這個時候呢,就需要我們今天的主角:extern "C"了!
為什麼要是用它extern "C"在進行C 開發的時候,由于C、C 編譯規則是不同的。C 編譯函數方法是使用mangle的技術。
而在C語言中是沒有這個技術的,所以如果我們想要調用C語言開發的一些API,就需要使用 extern "C"修飾C語言的函數聲明。
extern "C"用法(1)直接在函數前面加上 extern "C" 關鍵字
extern "C" void fun() {
printf("test");
}
(2)如果有函數聲明與函數實現,要讓函數聲明被 extern "C" 修飾,函數實現可以不修飾
extern "C" void func();
void func() {
cout << "func()" << endl;
}
(3)如果有多個函數要被extern "C" 修飾,可以直接用{}包裹
extern "C" {
void func();
void func1();
}
void func() {
cout << "func()" << endl;
}
void func1() {
cout << "func1()" << endl;
}
自定義C語言函數庫但是我們每次使用C語言的API都用這個extern "C"修飾那是不是太麻煩了,那我們學會了怎麼去使用extern "C",我們可以在編寫C語言API庫的時候,直接使用這個來修飾,那麼C 再去調用的時候就不用這麼麻煩了,直接使用這個函數就可以了。
但是這麼定義的話就會産生另一個問題,那麼就是無法在C語言文件中調用這個庫
因為在C語言中是沒有extern "C"這個關鍵字的。調用這個庫,就是直接把這個庫的文件代碼拷貝過來。例如:
那麼我們就需要在定義這個sum庫的時候加上一些約束規則,讓它在被C 調用的時候加上 extern "C" 關鍵字,在被C語言調用的時候去掉這個關鍵字。
__cplusplus這個宏是C 中特有的。它在加載C 文件的時候會提前定義這個宏,所以我們隻要判斷文件中是否有這個宏,有的話就是C 在調用,沒有的話就是C語言,這樣就可以很好地解決了這個混合調用的問題。
希望對你有幫助!
自學C/C 編程難度很大,不妨和一些志同道合的小夥伴一起學習成長!
C語言C 編程學習交流圈子,關注 私信【C/C 編程】C語言編程學習基地
有一些源碼和資料分享,歡迎轉行也學習編程的夥伴,和大家一起交流成長會比自己琢磨更快哦!
,
更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!