1C與C++相互調(diào)用
在一個(gè)嵌入式系統(tǒng)中大部分的底層和驅(qū)動(dòng)層更多的是采用C語(yǔ)言來(lái)進(jìn)行開發(fā),而上層應(yīng)用、服務(wù)更多的采用C++等高級(jí)語(yǔ)言來(lái)進(jìn)行面向?qū)ο蟮确矫娴拈_發(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ǔ)言編寫的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)操作

上面小哥畫了一張互調(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)注
183文章
7645瀏覽量
145913 -
C++
+關(guān)注
關(guān)注
22文章
2124瀏覽量
77263 -
代碼
+關(guān)注
關(guān)注
30文章
4973瀏覽量
74184
原文標(biāo)題:C代碼與C++互相調(diào)用的小技巧
文章出處:【微信號(hào):strongerHuang,微信公眾號(hào):strongerHuang】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
keil實(shí)現(xiàn)c與c++混合編程
汽車網(wǎng)絡(luò)安全開發(fā)語(yǔ)言選型指南:C/C++/Rust/Java等主流語(yǔ)言對(duì)比+Perforce QAC/Klocwork工具支持
C語(yǔ)言與C++的區(qū)別及聯(lián)系
C與C++之間的聯(lián)系
C語(yǔ)言和C++之間的區(qū)別是什么
C/C++條件編譯
C語(yǔ)言特性
C語(yǔ)言和單片機(jī)C語(yǔ)言有什么差異
C/C++代碼靜態(tài)測(cè)試工具Perforce QAC 2025.3的新特性
技能+1!如何在樹莓派上使用C++控制GPIO?
C++ 與 Python:樹莓派上哪種語(yǔ)言更優(yōu)?
基于LockAI視覺(jué)識(shí)別模塊:C++目標(biāo)檢測(cè)
主流的 MCU 開發(fā)語(yǔ)言為什么是 C 而不是 C++?
深入理解C語(yǔ)言:C語(yǔ)言循環(huán)控制
C語(yǔ)言與C++相互調(diào)用
評(píng)論