時常在cpp的代碼之中看到這樣的代碼:
#ifdef __cplusplus
extern "C" {
#endif
//一段代碼
#ifdef __cplusplus
}
#endif
這樣的代碼到底是什麼意思呢?首先,其中__cplusplus是C++編譯器的保留宏定義.就是說C++編譯器認為這個宏已經定義了.那麼定義了這個宏的話表示這是一段cpp的代碼
,也就是說,
上面的代碼的含義是:
如果這是一段cpp的代碼,那麼加入 extern "C"{ 和 } 處理其中的代碼;
extern "C" {
#endif
//一段代碼
}
#endif //* extern "C" */
如果這是一段c的代碼,那麼跳過extern "C"{ 和 } ,編譯:
#endif //* extern "C" */
//一段代碼
#endif //
要明白為何使用extern "C",還得從cpp中對函數的重載處理開始說起。在c++中,為了支援重載機制,在編譯產生的彙編碼中,要對函數的名字進行一些處理,加入比如函數
的傳回型別等等.而在C中,只是簡單的函數名字而已,不會加入其他的資訊.也就是說:C++和C對產生的函數名字的處理是不一樣的. 目的就是主要實現C與C++的相互調用問題。
c.h的實現
#ifndef _c_h_
#define _c_h_
#ifdef __cplusplus
extern "C" {
#endif
void C_fun();
#ifdef __cplusplus
}
#endif
#endif
-----------------------------------
c.c的實現
#include "c.h"
void C_fun()
{
}
------------------------------------
在cpp.cpp中調用c.c中的C_test()
cpp.cpp的實現
#include "c.h"
int main()
{
C_fun()
}
其中__cplusplus是C++編譯器的保留宏定義.就是說C++編譯器認為這個宏已經定義了.
所以關鍵是extern "C" {}
extern "C"是告訴C++編譯器件括弧裡的東東是按照C的obj檔案格式編譯的,要串連的話按照C的命名規則去找.
==========================
那麼C中是如何調用C++中的函數cpp_fun()呢?
因為先有C後有C++, 所以只能從C++的代碼中考慮了.
加入C++中的函數或變數有可能被C中的檔案調用,則應該這樣寫,也是用extern "C"{}
不過是代碼中要加,標頭檔也要加,因為可能是C++中也調用
--------------------------------------
cpp.h的實現
#ifndef _c_h_
#define _c_h_
#ifdef __cplusplus
extern "C" {
#endif
void CPP_fun();
#ifdef __cplusplus
}
#endif
.-------------------------------------------
Cpp.cpp的實現
extern "C" { //告訴C+++編譯器,擴號裡按照C的命名規則編譯
void CPP_fun()
{
.....
}
總結
C和C++對函數的處理方式是不同的.extern "C"是使C++能夠調用C寫作的庫檔案的一個手段,如果要對編譯器提示使用C的方式來處理函數的話,那麼就要使用extern "C"來說
明。