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