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】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
Spire.XLS for C++組件說明
![Spire.XLS for <b class='flag-5'>C++</b>組件說明](https://file1.elecfans.com/web3/M00/05/E7/wKgZO2eFwUuAbuoQAAAbn_khf8A091.png)
AKI跨語言調用庫神助攻C/C++代碼遷移至HarmonyOS NEXT
同樣是函數,在C和C++中有什么區別
C++中實現類似instanceof的方法
![<b class='flag-5'>C++</b>中實現類似instanceof的方法](https://file1.elecfans.com/web2/M00/FE/0C/wKgaomaYe1CAQ31QAAAnf0IkoSU605.png)
SEGGER編譯器優化和安全技術介紹 支持最新C和C++語言
![SEGGER編譯器優化和安全技術介紹 支持最新<b class='flag-5'>C</b>和<b class='flag-5'>C++</b><b class='flag-5'>語言</b>](https://file1.elecfans.com/web2/M00/EC/80/wKgaomZew0OAa4J1AAAcf4qxt2I454.png)
C/C++中兩種宏實現方式
使用 MISRA C++:2023? 避免基于范圍的 for 循環中的錯誤
![使用 MISRA <b class='flag-5'>C++</b>:2023? 避免基于范圍的 for 循環中的錯誤](https://file1.elecfans.com/web2/M00/A9/66/wKgZomUl7m-AHJX6AABuJjgxs14678.png)
為什么很少用C++開發單片機
![為什么很少用<b class='flag-5'>C++</b>開發單片機](https://file1.elecfans.com/web2/M00/C6/8F/wKgaomYBGYeAEfT2AAAsOmCJ4d8781.png)
C語言#define的應用
![<b class='flag-5'>C</b><b class='flag-5'>語言</b>#define的應用](https://file1.elecfans.com/web2/M00/C3/B9/wKgaomXn42eACLumAAAag1PydyU214.png)
評論