C/C++之間的相互呼叫
C呼叫C++意思是 .c檔案中呼叫.cpp檔案中的程式碼
C++呼叫C的意思是.cpp檔案中呼叫.c檔案中的程式碼
使用extern "C" 主要原因:主要用於在C++程式碼中呼叫的C函式的宣告,或C++中編譯的函式要在C中呼叫,也即是匯入C形式的函式庫或者提供C型別的庫給C呼叫,因為在C++出現以前,很多程式碼都是C語言寫的,而且很底層的庫也是C語言寫的,為了更好的支援原來的C程式碼和已經寫好的C語言庫,需要在C++中儘可能的支援C,而extern "C"就是其中的一個策略。
C編譯器編譯函式時不帶引數的型別資訊,只包含函式的符號名字。如int func( int x )
- C編譯器會將此函式編譯成類似_func的符號,C聯結器只要找到了呼叫函式的符號,就認為連線成功。
- 而C++編譯器為了實現函式過載,會在編譯時帶上函式的引數資訊。如它可以把上面的函式編譯成類似於_func_int這樣的符號。
extern"C"的使用:通過extern"C"可以實現混合編譯,讓編譯器以C的語言規則來處理程式碼。
一、C++呼叫C (.cpp檔案中加extern "C")
C++呼叫C,extern "C" 的作用是:讓C++聯結器找呼叫函式的符號時採用C的方式。
#include<stdio.h> extern "C" { void Show()//以_Show的符號查詢連線 { printf("show.c: void Show()\n"); } } int main() { Show(); return 0; }
二、C呼叫C++
C呼叫C++,使用extern "C"則是告訴編譯器依照C的方式來編譯封裝介面,當然介面函式裡面的C++語法還是按C++方式編譯
- 修改C++的檔案 .cpp檔案中加extern"C"(和C++呼叫C介面的處理方式相同,介面函式裡的編譯語法還是C++編譯)
#include<stdio.h> extern "C" { void Show()//以_Show的符號查詢連線,Show函式裡的編譯語法還是C++ { printf("show.c: void Show()\n"); } } int main() { Show(); return 0; }
- 不修改C++裡的檔案(加中間層處理),如下圖:
如上圖,建立中間層Middle來呼叫Show函式,使用時宣告Middle,再呼叫Show。
三、編譯器原始檔不確定什麼編譯器編譯:
時常在cpp的程式碼之中看到這樣的程式碼: 特別是C ++中引入C的標頭檔案,這些C標頭檔案中出現很多如下程式碼。
#ifdef __cplusplus
extern "C"
{
#endif
//一段程式碼
#ifdef __cplusplus
}
#endif
例:
#ifdef __cplusplus
extern "C"
{
#endif
void CShow()
{
printf("Show1.c : void CShow()");
}
#ifdef __cplusplus
}
#endif
__cplusplus是C++編譯器的保留巨集定義.
所以關鍵還是extern "C" {}
extern "C"是告訴C++編譯器件括號裡的東西是按照C的obj檔案格式編譯的,要連線的話按照C的命名規則去找