0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

C語(yǔ)言與C++相互調(diào)用

strongerHuang ? 來(lái)源:strongerHuang ? 作者:嵌入式情報(bào)局 ? 2021-01-18 11:05 ? 次閱讀

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++的編譯方式。

d2761992-58f7-11eb-8b86-12bb97331649.png

所以理論上來(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)操作

d299372e-58f7-11eb-8b86-12bb97331649.png

上面小哥畫(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)注明出處。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • C語(yǔ)言
    +關(guān)注

    關(guān)注

    180

    文章

    7594

    瀏覽量

    135850
  • C++
    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)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    C語(yǔ)言C++中結(jié)構(gòu)體的區(qū)別

    同樣是結(jié)構(gòu)體,看看在C語(yǔ)言C++中有什么區(qū)別?
    的頭像 發(fā)表于 10-30 15:11 ?101次閱讀

    C7000優(yōu)化C/C++編譯器

    電子發(fā)燒友網(wǎng)站提供《C7000優(yōu)化C/C++編譯器.pdf》資料免費(fèi)下載
    發(fā)表于 10-30 09:45 ?0次下載
    <b class='flag-5'>C</b>7000優(yōu)化<b class='flag-5'>C</b>/<b class='flag-5'>C++</b>編譯器

    C++語(yǔ)言基礎(chǔ)知識(shí)

    電子發(fā)燒友網(wǎng)站提供《C++語(yǔ)言基礎(chǔ)知識(shí).pdf》資料免費(fèi)下載
    發(fā)表于 07-19 10:58 ?6次下載

    鴻蒙OS開(kāi)發(fā)實(shí)例:【Native C++

    使用DevEco Studio創(chuàng)建一個(gè)Native C++應(yīng)用。應(yīng)用采用Native C++模板,實(shí)現(xiàn)使用NAPI調(diào)用C標(biāo)準(zhǔn)庫(kù)的功能。使用C
    的頭像 發(fā)表于 04-14 11:43 ?2449次閱讀
    鴻蒙OS開(kāi)發(fā)實(shí)例:【Native <b class='flag-5'>C++</b>】

    為什么很少用C++開(kāi)發(fā)單片機(jī)

    C語(yǔ)言是面向過(guò)程的語(yǔ)言C++是面向?qū)ο蟮木幊?b class='flag-5'>語(yǔ)言。結(jié)合本文來(lái)說(shuō),面向過(guò)程相比面向?qū)ο蟮木幊?,生成代碼量(bin文件)更小,運(yùn)行效率更高。
    發(fā)表于 03-25 14:26 ?789次閱讀
    為什么很少用<b class='flag-5'>C++</b>開(kāi)發(fā)單片機(jī)

    c語(yǔ)言,c++,java,python區(qū)別

    C語(yǔ)言C++、Java和Python是四種常見(jiàn)的編程語(yǔ)言,各有優(yōu)點(diǎn)和特點(diǎn)。 C語(yǔ)言
    的頭像 發(fā)表于 02-05 14:11 ?2110次閱讀

    OpenHarmony 之 NAPI 框架介紹

    NAPI 是什么 NAPI 的概念源自 Nodejs,為了實(shí)現(xiàn) javascript 腳本與 C++ 庫(kù)之間的相互調(diào)用,Nodejs 對(duì) V8 引擎的 api 做了一層封裝,稱(chēng)為 NAPI??梢栽?/div>
    的頭像 發(fā)表于 02-01 17:34 ?622次閱讀
    OpenHarmony 之 NAPI 框架介紹

    vb語(yǔ)言c++語(yǔ)言的區(qū)別

    VB語(yǔ)言C++語(yǔ)言是兩種不同的編程語(yǔ)言,雖然它們都屬于高級(jí)編程語(yǔ)言,但在設(shè)計(jì)和用途上有很多區(qū)別。下面將詳細(xì)比較VB
    的頭像 發(fā)表于 02-01 10:20 ?1948次閱讀

    C++簡(jiǎn)史:C++是如何開(kāi)始的

    的 MISRA C++:2023 博客系列的第二部分。 在這篇博客中,我們將深入探討 C++ 的歷史、編程語(yǔ)言多年來(lái)的發(fā)展歷程以及它的下一步發(fā)展方向。
    的頭像 發(fā)表于 01-11 09:00 ?513次閱讀
    <b class='flag-5'>C++</b>簡(jiǎn)史:<b class='flag-5'>C++</b>是如何開(kāi)始的

    C語(yǔ)言C++中那些不同的地方

    C語(yǔ)言雖說(shuō)經(jīng)常和C++在一起被大家提起,但可千萬(wàn)不要以為它們是一個(gè)東西?,F(xiàn)在我們常用的C語(yǔ)言C
    的頭像 發(fā)表于 12-07 14:29 ?889次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>和<b class='flag-5'>C++</b>中那些不同的地方

    開(kāi)箱即用!教你如何正確使用華為云CodeArts IDE for C/C++!

    華為云CodeArts IDE 定位華為云開(kāi)發(fā)者桌面 ,是華為云面向開(kāi)發(fā)者提供的一款智能化桌面集成開(kāi)發(fā)環(huán)境。CodeArts IDE for C/C++集成了華為自研的C/C++
    的頭像 發(fā)表于 11-29 17:40 ?741次閱讀
    開(kāi)箱即用!教你如何正確使用華為云CodeArts IDE for <b class='flag-5'>C</b>/<b class='flag-5'>C++</b>!

    如何選擇創(chuàng)建c語(yǔ)言c++

    選擇創(chuàng)建 C 語(yǔ)言C++ 都需要綜合考慮多個(gè)因素。在決定使用哪種語(yǔ)言之前,我們需要對(duì)這兩種語(yǔ)言的特點(diǎn)、優(yōu)缺點(diǎn)、適用場(chǎng)景、學(xué)習(xí)成本等進(jìn)行全
    的頭像 發(fā)表于 11-27 15:58 ?558次閱讀

    visualc++怎么新建c語(yǔ)言文件

    Visual C++ 是一個(gè)集成開(kāi)發(fā)環(huán)境(IDE),用于開(kāi)發(fā) CC++ 程序。在 Visual C++ 中,新建一個(gè) C
    的頭像 發(fā)表于 11-27 15:57 ?3458次閱讀

    c++怎么開(kāi)始編程

    C++是一種高級(jí)的、通用的編程語(yǔ)言,用于開(kāi)發(fā)各種類(lèi)型的應(yīng)用程序。它是從C語(yǔ)言演變而來(lái),也是一種靜態(tài)類(lèi)型語(yǔ)言,可以在不同的平臺(tái)上進(jìn)行開(kāi)發(fā)。
    的頭像 發(fā)表于 11-27 15:56 ?875次閱讀

    C/C++語(yǔ)言學(xué)習(xí)大全套

    電子發(fā)燒友網(wǎng)站提供《C/C++語(yǔ)言學(xué)習(xí)大全套.rar》資料免費(fèi)下載
    發(fā)表于 11-18 14:33 ?4次下載
    <b class='flag-5'>C</b>/<b class='flag-5'>C++</b><b class='flag-5'>語(yǔ)言</b>學(xué)習(xí)大全套