做者:宋老師,華清遠見嵌入式學院講師。c++
一、在好多程序中咱們會遇到下面代碼段函數
#ifdef __cplusplus
extern "C" {
#endif編碼
//c語法代碼段spa
#ifdef __cplusplus
}
#endif //orm
首先應該知道,__cplusplus是CPP中的自定義宏,則表示這是一段cpp的代碼,編譯器按c++的方式編譯系統.。若是這時候咱們須要使用c語言的代碼,那麼就須要加上(extern "C" { )這一段來講明,要不編譯器會把c代碼按c++模式編譯,會出現問題。get
這句話的意思是:這個代碼是CPP的代碼,__cplusplus是cpp中的自定義宏,所以,以CPP語言的形式編譯,可是裏面的代碼有C語言的代碼,那麼就要「extern "C" { 」說明一下,編譯器用C語言的模式編譯。編譯器
#ifdef __cplusplus //c++編譯環境中才會定義__cplusplus (plus就是"+"的意思)
extern"C"{ /告訴編譯器下面的函數是c語言函數(由於c++和c語言對函數的編譯轉換不同,主要是c++中存在重載)
#endifit
要明白爲什麼使用extern "C"{,還得從CPP中對函數的重載處理開始提及。在c++中,爲了支持重載機制,在編譯生成的彙編碼中,要對函數的名字進行一些處理,加入好比函數的返回類型等等。而在C中,只是簡單的函數名字而已,不會加入其餘的信息。也就是說:C++和C對產生的函數名字的處理是不同的。 加上extern "C"{ 目的,就是主要實現C與C++的相互調用問題。io
extern "C"是鏈接申明(linkage declaration),被extern "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()
{
}
------------------------------------
在cxx.cpp中調用c.c中的C_fun()
cxx.cpp的實現
#include "c.h"
int main()
{
C_fun()
}
C++調用C的函數時,在c++的 .h 文件中加extern "C" {}。
因此關鍵是extern "C" {} ,extern "C"是告訴C++編譯器件括號裏的東東是按照C的obj文件格式編譯的,要鏈接的話按照C的命名規則去找。
二、C調用C++中的函數CPP_fun()
由於先有C後有C++,因此只能從C++的代碼中考慮了。加入C++中的函數或變量有可能被C中的文件掉用,則應該這樣寫,也是用extern "C"{},不過是代碼中要加,頭文件也要加,由於多是C++中也調用
Cxx.h的實現
#ifndef _c_h_
#define _c_h_
#ifdef __cplusplus
extern "C" {
#endif
void CPP_fun();
#ifdef __cplusplus
}
#endif
#endif
Cxx.cpp的實現
extern "C" { //告訴C+++編譯器,擴號裏按照C的命名規則編譯
void CPP_fun()
{
.....
}
}
c.c的實現
#include "Cpp.h"
int main()
{
CPP_fun()
}
總結:C和C++對函數的處理方式是不一樣的.extern "C"是使C++可以調用C寫做的庫文件的一個手段,若是要對編譯器提示使用C的方式來處理函數的話,那麼就要使用extern "C"來講明。