注意,本文的前提是,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 #ifdef __ADD_H__ #define __ADD_H__ extern "C" int add(int a, int b); #endif // add.c int add(int a, int b) { return a + b; } // main.cc #include <iostream> #include "add.h" using namespace std; int main() { cout << "1 + 1 = " << add(1, 1) << endl; }
在例子中,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 #ifdef __PRINTNUM_H__ #define __PRINTNUM_H__ extern "C" void printNum(int a); #endif // printNum.cc #include <iostream> #include "printNum.h" using namespace std; void printNum(int a) { cout << << "num is " << a << endl; } // main.c extern void printNum(int a); printNum(5);
通過將cout函式封裝為類c語言規約的介面函式,使得main.c中可以成功呼叫c++函式printNum,
值得注意的是,main.c不可以直接引入printNum.h,因為c語言不能識別extern "C"關鍵字,可以利用c++預定義宏實作頭檔案的改寫:
#ifdef __PRINTNUM_H__ #define __PRINTNUM_H__ #ifdef __cplusplus extern "C" { #endif void printNum(int a); #ifdef __cplusplus } #endif #endif
#ifdef __PRINTNUM_H__ #define __PRINTNUM_H__ #ifdef __cplusplus extern "C" { #endif void printNum(int a); #ifdef __cplusplus } #endif #endif
小結
|
? c語言與c++的相互呼叫可以通過 extern "C" 關鍵字實作 ? c++中呼叫c代碼,只須在c++中為c代碼函式宣告之前加上extern "C" ? c語言呼叫c++代碼,則需要將c++代碼編譯成靜態庫或動態庫,然后對外提供用 extern "C" 宣告的類c封裝函式 |

不管你是轉行也好,初學也罷,進階也可——【值得關注進入】的C/C++編程學習進階俱樂部
涉及到:C語言、C++、windows編程、網路編程、QT界面開發、Linux編程、游戲編程、黑客等等......

一個活躍、高格調、高層次的程式員編程學習殿堂;編程入門只是順帶,思維的提高才有價值!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/224959.html
標籤:C
