1C與C++相互調用
在一個嵌入式系統中大部分的底層和驅動層更多的是采用C語言來進行開發,而上層應用、服務更多的采用C++等高級語言來進行面向對象等方面的開發方式,那么就存在一個上層調用底層接口的問題,比如最常用的C++調用C的接口來完成相應的外設驅動接口。
我們知道C++幾乎是完全兼容C的,不同的編譯語言都有其自身的一套編譯規則,當然C語言與C++的編譯規則是不同的,但C++編譯器為了兼容C語言相當于兼容了C語言編譯方式,而C語言編譯器一般就不會去兼容C++的編譯方式。
所以理論上來說用C編譯器編譯好的模塊能夠直接通過C++來進行調用才對。
2extern關鍵字
由于C++編譯器默認都是按照C++的編譯方式來對源文件進行編譯,這樣C語言文件也會直接采用C++編譯。
對于底層的驅動等都會以使用C語言編寫的DLL等給出來,然后從中導出函數給C或C++的模塊來進行訪問,所以還是需要C++語法中能夠標識出來給編譯器,哪些需要采用C++方式編譯,哪些需要采用C方式編譯。
那么這個編譯區分就由extern “C”來完成,下面我們就以一個例子看看如何使用的。
//FileName:main.c #include#include #include"Cal.h" intmain(intargc,char**argv){ printf("Cal(int):%d ",Cal(5)); printf("Cal(float):%.5f ",Cal(1.1f)); return0; }
//FileName:Cal.c #include"Cal.h" intCal(intVal) { returnVal*Val; } floatCal(floatVal) { returnVal*Val; }
//FileName:Cal.h #ifndef__CAL_H__ #define__CAL_H__ //extern"C" //{ intCal(intVal); floatCal(floatVal); //} #endif
以上extern “C”注釋部分表示的就是Cal.c文件將會以C編譯方式進行,由于C++支持函數重載而C語言不支持函數重載,所以以上源碼可以直接編譯可以通過,而一旦把extern“C”注釋去掉,便會編譯失敗。
3互調操作
上面小哥畫了一張互調的簡圖,并分別解釋一下:
1)C++編譯器通過extern “C”即可直接調用以C方式編譯的庫文件,最終與其他文件一起編譯成為一個可執行文件。
2)C++編譯器首先將模塊用extern “C”方式編譯好,C編譯器直接拿了該模塊文件與其他文件一起編譯生成可執行文件。
4小技巧
在C++編譯器內部一般都會內置__cplusplus這樣一個宏定義,那么我們可以通過使用該宏來設置一個預編譯結構,當在C++編譯器下就使用extern “C”編譯C模塊代碼,否則就剔除,相信大家在一些庫文件中經常看到。
#ifdef__cplusplus extern"C" { #endif //fuctiondefinitionordeclaration #ifdef__cplusplus } #endif
責任編輯:xj
原文標題:C代碼與C++互相調用的小技巧
文章出處:【微信公眾號:strongerHuang】歡迎添加關注!文章轉載請注明出處。
-
C語言
+關注
關注
180文章
7614瀏覽量
137732 -
C++
+關注
關注
22文章
2114瀏覽量
73859 -
代碼
+關注
關注
30文章
4828瀏覽量
69058
原文標題:C代碼與C++互相調用的小技巧
文章出處:【微信號:strongerHuang,微信公眾號:strongerHuang】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論