1C與C++相互調(diào)用
在一個嵌入式系統(tǒng)中大部分的底層和驅(qū)動層更多的是采用C語言來進行開發(fā),而上層應用、服務更多的采用C++等高級語言來進行面向?qū)ο蟮确矫娴拈_發(fā)方式,那么就存在一個上層調(diào)用底層接口的問題,比如最常用的C++調(diào)用C的接口來完成相應的外設驅(qū)動接口。
我們知道C++幾乎是完全兼容C的,不同的編譯語言都有其自身的一套編譯規(guī)則,當然C語言與C++的編譯規(guī)則是不同的,但C++編譯器為了兼容C語言相當于兼容了C語言編譯方式,而C語言編譯器一般就不會去兼容C++的編譯方式。
所以理論上來說用C編譯器編譯好的模塊能夠直接通過C++來進行調(diào)用才對。
2extern關(guān)鍵字
由于C++編譯器默認都是按照C++的編譯方式來對源文件進行編譯,這樣C語言文件也會直接采用C++編譯。
對于底層的驅(qū)動等都會以使用C語言編寫的DLL等給出來,然后從中導出函數(shù)給C或C++的模塊來進行訪問,所以還是需要C++語法中能夠標識出來給編譯器,哪些需要采用C++方式編譯,哪些需要采用C方式編譯。
那么這個編譯區(qū)分就由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++支持函數(shù)重載而C語言不支持函數(shù)重載,所以以上源碼可以直接編譯可以通過,而一旦把extern“C”注釋去掉,便會編譯失敗。
3互調(diào)操作
上面小哥畫了一張互調(diào)的簡圖,并分別解釋一下:
1)C++編譯器通過extern “C”即可直接調(diào)用以C方式編譯的庫文件,最終與其他文件一起編譯成為一個可執(zhí)行文件。
2)C++編譯器首先將模塊用extern “C”方式編譯好,C編譯器直接拿了該模塊文件與其他文件一起編譯生成可執(zhí)行文件。
4小技巧
在C++編譯器內(nèi)部一般都會內(nèi)置__cplusplus這樣一個宏定義,那么我們可以通過使用該宏來設置一個預編譯結(jié)構(gòu),當在C++編譯器下就使用extern “C”編譯C模塊代碼,否則就剔除,相信大家在一些庫文件中經(jīng)常看到。
#ifdef__cplusplus extern"C" { #endif //fuctiondefinitionordeclaration #ifdef__cplusplus } #endif
責任編輯:xj
原文標題:C代碼與C++互相調(diào)用的小技巧
文章出處:【微信公眾號:strongerHuang】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
-
C語言
+關(guān)注
關(guān)注
180文章
7628瀏覽量
139758 -
C++
+關(guān)注
關(guān)注
22文章
2116瀏覽量
74587 -
代碼
+關(guān)注
關(guān)注
30文章
4880瀏覽量
70025
原文標題:C代碼與C++互相調(diào)用的小技巧
文章出處:【微信號:strongerHuang,微信公眾號:strongerHuang】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
源代碼加密、源代碼防泄漏c/c++與git服務器開發(fā)環(huán)境

Spire.XLS for C++組件說明

EE-128:C語言中的DSP:從C調(diào)用匯編類成員函數(shù)

AKI跨語言調(diào)用庫神助攻C/C++代碼遷移至HarmonyOS NEXT
同樣是函數(shù),在C和C++中有什么區(qū)別
C7000 C/C++優(yōu)化指南用戶手冊

TMS320C6000優(yōu)化C/C++編譯器v8.3.x

TMS320C28x優(yōu)化C/C++編譯器v22.6.0.LTS

基于OpenHarmony標準系統(tǒng)的C++公共基礎類庫案例:SafeMap

OpenVINO2024 C++推理使用技巧
C++中實現(xiàn)類似instanceof的方法

SEGGER編譯器優(yōu)化和安全技術(shù)介紹 支持最新C和C++語言

評論