调用其他文件的define_C与C++的互相调用!就像大学宿舍一样,我用你的,你用我的!...
注意,本文的前提是,c代碼采用gcc等c語言編譯器編譯c代碼,采用g++等c++編譯器編譯c++代碼,如果c和c++代碼統一使用g++編譯,大部分情況是可以實現兩者代碼相互調用的。
以下為踩坑過程的總結o_O||。
C 與 C++ 的函數區別
要了解兩者之間如何實現相互調用,必須先了解c與c++之間的函數有什么不同。
c++作為c語言的升級版,兩者必然有很多不同之處。
其中有一個重大不同點就是,c++支持函數重載,而c語言不支持。為了使函數支持重載,c++在c語言的基礎上,將函數名添加上返回值和參數的類型信息。
例如,int add(int, int)這個函數,通過c++編譯器編譯后,可能呈現的函數名為int int_add_int_int(int, int)(注:此處為大概地說明c++是如何將返回值和參數信息添加到函數名中的,實際中編譯器不一定是這樣實現的)。
從以上說明可以得出,由于c++對函數重載的支持,使得編譯后的函數符號與c語言的不一致,即使是在兩者函數名相同的前提下。
extern "C"的作用
那么,c與c++是不能相互調用了嗎?答案是否定的,因為存在著extern "C"這個關鍵字可以使語句可以按照類C的編譯和連接規約來編譯和連接,而不是C++的編譯的連接規約。這樣在類C的代碼中就可以調用C++的函數or變量等。
注意:extern "C"指令中的"C",表示的一種編譯和連接規約,而不是一種語言。"C"表示符合C語言的編譯和連接規約的任何語言,如Fortran、assembler等。
還有要說明的是,extern "C"指令僅指定編譯和連接規約,但不影響語義。例如在函數聲明中,指定了extern "C",仍然要遵守C++的類型檢測、參數轉換規則。
C++ 中調用 C 代碼
對于c++,由于c++的編譯器對c語言兼容,因此在c++中調用c語言編寫的函數,只需要在函數聲明前面加上關鍵字extern "C",表示采用類c語言的方式解析函數符號。例子如下:
// add.h在例子中,http://main.cc為c++代碼,add.c為c語言代碼,當c++編譯器識別到extern "C"`關鍵字時,會去尋找add函數的實現而不是尋找類似int_add_int_int這樣帶參數信息的函數實現。
C 語言調用 C++ 代碼
c語言調用c++代碼卻并不容易,原因是c語言并不兼容c++。
就算c語言可以調用c++,也會因為無法識別c++新定義的符號而編譯報錯。
因此,為了實現c語言調用c++函數,必須實現以下兩個步驟:
1. 將c++相關函數封裝為靜態庫或動態庫(因為調用庫函數時編譯器并不知道里面執行的是什么語言);
2. 對外提供遵循類c語言規約的接口函數。
例子如下所示:
// printNum.h通過將cout函數封裝為類c語言規約的接口函數,使得main.c中可以成功調用c++函數printNum。
值得注意的是,main.c不可以直接引入printNum.h,因為c語言不能識別extern "C"關鍵字。可以利用c++預定義宏實現頭文件的改寫:
#ifdef __PRINTNUM_H__小結
? c語言與c++的相互調用可以通過 extern "C" 關鍵字實現
? c++中調用c代碼,只須在c++中為c代碼函數聲明之前加上extern "C"
? c語言調用c++代碼,則需要將c++代碼編譯成靜態庫或動態庫,然后對外提供用 extern "C" 聲明的類c封裝函數
不管你是轉行也好,初學也罷,進階也可——【值得關注進入】小編的C/C++編程學習進階專欄 :
C/C++編程學習殿堂?www.zhihu.com涉及到:C語言、C++、windows編程、網絡編程、QT界面開發、Linux編程、游戲編程、黑客等等......
總結
以上是生活随笔為你收集整理的调用其他文件的define_C与C++的互相调用!就像大学宿舍一样,我用你的,你用我的!...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 职业教育概念上市公司 未来可能会迎来大的
- 下一篇: c++ 函数过长 拆分_实用EXECL办