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

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

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

C與C++混合編程是什么

汽車電子技術(shù) ? 來(lái)源:IOT物聯(lián)網(wǎng)小鎮(zhèn) ? 作者: 道哥 ? 2023-02-14 13:48 ? 次閱讀

這篇文章講解的知識(shí)點(diǎn)很“小”,但是在C和C++的混合編程中非常重要。因?yàn)槲覀冊(cè)趯憫?yīng)用程序時(shí),經(jīng)常利用到第三方的程序。如果我們的代碼用C,但是第三方代碼是C++;或者我們的代碼用C++,而第三方的代碼是C,那么在整合的時(shí)候就需要仔細(xì)一點(diǎn)了。

一、C調(diào)用C++中的函數(shù)

  1. 被調(diào)用C++代碼中的頭文件(callee.h)

圖片

  1. 被調(diào)用C++代碼中的源文件(callee.cpp)

圖片

  1. 被調(diào)用C++代碼編譯成目標(biāo)文件(callee.o)

圖片

知識(shí)點(diǎn):

(1)關(guān)于 __cplusplus

編譯器使用g++,所有的C++編譯器中都會(huì)定義宏:__cplusplus,因此在編譯callee.h的時(shí)候,會(huì)把函數(shù)聲明包裹在extern "C" 中。

(2)關(guān)于 extern "C"

CC++編譯器,在編譯一個(gè)函數(shù)的時(shí)候,編譯策略是不同的。C++會(huì)對(duì)函數(shù)的名稱進(jìn)行改寫(而且每個(gè)C++編譯器對(duì)于名字改寫的規(guī)則也是不一樣的,甚至同一個(gè)編譯器的不同版本的名字改寫規(guī)則也不一樣,因此,使用C++時(shí)最好用相同的編譯器版本對(duì)項(xiàng)目中的所有模塊進(jìn)行編譯。補(bǔ)充:改寫的目的是為了實(shí)現(xiàn)C++語(yǔ)言中的函數(shù)重載)。



在callee.h中,把函數(shù) cpp_hello 放在 extern "C" 中,意思就是告訴編譯器g++: 這個(gè)函數(shù)是需要被C調(diào)用的,請(qǐng)不要對(duì)這個(gè)函數(shù)進(jìn)行名字改寫。



可以通過(guò) nm 指令查看一下目標(biāo)文件callee.o中的符號(hào):

圖片

我們可以多做一個(gè)測(cè)試:把extern "C"去掉之后,看一下這個(gè)函數(shù)如何被g++改寫了名字:

圖片

  1. 主調(diào)用C代碼中的源文件(caller.c)

圖片

  1. 編譯主調(diào)用C文件,得到可執(zhí)行文件

圖片

知識(shí)點(diǎn):

(1)caller.c在 include “callee.h" 時(shí),gcc編譯器中沒(méi)有定義 __cplusplus 宏,所以 callee.h 中就相當(dāng)于只有一句話:void cpp_helo();

(2)在調(diào)用 cpp_hello()函數(shù)時(shí),雖然這個(gè)函數(shù)是用g++編譯的,但是由于使用了 extern "C",所以名字沒(méi)有被編譯器g++改寫,也就是說(shuō),在callee.o目標(biāo)文件中,函數(shù)的名字就是 "cpp_hello",所以可以順利的被C代碼調(diào)用到。

二、C++調(diào)用C中的函數(shù)

  1. 被調(diào)用C代碼中的頭文件(callee.h)

圖片

  1. 被調(diào)用C代碼中的源文件(callee.c)

圖片

  1. 被調(diào)用C代碼編譯成目標(biāo)文件(callee.o)

圖片

知識(shí)點(diǎn):

編譯器使用gcc,其中沒(méi)有定義宏:__cplusplus,因此在編譯callee.h的時(shí)候,相當(dāng)于只有一個(gè)函數(shù)聲明。因此函數(shù)c_hello在被編譯到callee.o目標(biāo)文件中時(shí),沒(méi)有被改名。
  1. 主調(diào)用C++代碼源文件(caller.cpp)

圖片

  1. 編譯主調(diào)用C++文件,得到可執(zhí)行文件

圖片

知識(shí)點(diǎn):

g++在編譯callee.h時(shí),由于g++中定義了__cplusplus宏,因此它在調(diào)用函數(shù) c_hello時(shí),就會(huì)按照C的方式去調(diào)用(也就是沒(méi)有名字改寫),所以就能順利的在callee.o中查找到這個(gè)函數(shù)。

三、總結(jié)

  1. 在C++代碼的函數(shù)聲明時(shí),如果代碼會(huì)被C程序調(diào)用,一定要加上 extern "C"。
  2. 在C代碼的函數(shù)聲明時(shí),如果代碼會(huì)被C++程序調(diào)用,也要加上extern "C"。
  3. 在用C++編程時(shí),最好各模塊統(tǒng)一使用相同的編譯器,包括版本最好也相同。
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(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++
    C++
    +關(guān)注

    關(guān)注

    22

    文章

    2113

    瀏覽量

    73738
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4807

    瀏覽量

    68786
  • 應(yīng)用程序
    +關(guān)注

    關(guān)注

    37

    文章

    3284

    瀏覽量

    57773
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    STM32CubeMX如何在*.c源文件中使用c++特性?

    開(kāi)發(fā)環(huán)境:Visual Studio 2015 + VisualGDB (編譯器為arm-eabi GCC 7.2.0)+ STM32CubeMX cc++混合編程情況下,*.c文件
    發(fā)表于 04-25 06:15

    Matlab與C/C++ 混合編程技術(shù)總結(jié)的太棒了

    在工程實(shí)踐中,用戶經(jīng)常遇到Matlab 與C/C++混合編程的問(wèn)題。本文基于Matlab 6.5和VC6.0 開(kāi)發(fā)環(huán)境,在Windows 平臺(tái)下就它們之間的混合編程問(wèn)題進(jìn)行深入研究并舉
    發(fā)表于 04-26 06:42

    STM32c/c++混合編程

    在所有使用C++方法的地方加上:#ifdef __cplusplus,如:#ifdef __cplusplusclass LED{};#endif此外,主函數(shù)所有#include 的.h文件用
    發(fā)表于 08-23 07:47

    ARM匯編與C混合編程的相關(guān)資料分享

    慕課電子科技大學(xué).嵌入式系統(tǒng).第五章.ARM匯編程序設(shè)計(jì).ARM匯編與C混合編程0 目錄5 ARM匯編程序設(shè)計(jì)5.3 ARM匯編與C
    發(fā)表于 11-09 06:17

    RT-Thread如何實(shí)現(xiàn)C\C++混合編譯?要在哪里修改GCC的鏈接腳本?

    RT-Thread的工程要將外部C++的算法程序移植進(jìn)來(lái)混合編譯,C++程序有xxx.h,xxx.cpp兩個(gè)源文件,直接使用build.sh報(bào)了很多錯(cuò)誤,肯定無(wú)法編譯!已經(jīng)做過(guò)如下實(shí)驗(yàn):1.目前我
    發(fā)表于 03-22 14:41

    C語(yǔ)言和匯編語(yǔ)言混合編程方法和C語(yǔ)言中斷處理方法

    C語(yǔ)言和匯編語(yǔ)言混合編程方法和C語(yǔ)言中斷處理方法,new
    發(fā)表于 01-06 14:36 ?36次下載

    Matlab與C混合編程匯總

    接受matlab與C,C++混合編程的方法案例
    發(fā)表于 01-14 16:09 ?0次下載

    C_與Matlab混合編程在BEAM繪制中的應(yīng)用_范嬋嬌

    C_與Matlab混合編程在BEAM繪制中的應(yīng)用_范嬋嬌
    發(fā)表于 03-19 11:26 ?0次下載

    基于MSP430單片機(jī)C語(yǔ)言和匯編語(yǔ)言混合編程

    基于MSP430單片機(jī)C語(yǔ)言和匯編語(yǔ)言混合編程
    發(fā)表于 10-12 17:05 ?18次下載
    基于MSP430單片機(jī)<b class='flag-5'>C</b>語(yǔ)言和匯編語(yǔ)言<b class='flag-5'>混合編程</b>

    Matlab與C/C++混合編程接口及應(yīng)用方法解析

    地提高工程分析計(jì)算的效率[2][3]。但與其他高級(jí)程序[3]相比,Matlab 程序 是一種解釋執(zhí)行程序,不用編譯等預(yù)處理,程序運(yùn)行速度較慢[4]。 C/C++語(yǔ)言是目前最為流行的高級(jí)程序設(shè)計(jì)語(yǔ)言之一[5]。它可對(duì)操作系統(tǒng)和應(yīng)用程序以 及硬件進(jìn)行直接
    發(fā)表于 10-21 10:24 ?0次下載

    淺談關(guān)于DSP6000中C/C++語(yǔ)言和匯編語(yǔ)言的混合編程的方法

    一、混合編程的方法主要有以下幾種: (1)獨(dú)立編寫C語(yǔ)言程序和匯編程序,分別編譯形成各自的目標(biāo)代碼塊, 然后用連接器將兩種模塊連接起來(lái)。 (2)直接在C/
    發(fā)表于 10-24 10:10 ?1次下載

    ARM Bootloader 的實(shí)現(xiàn)C 和 ASM 混合編程

    ARM Bootloader 的實(shí)現(xiàn)C 和 ASM 混合編程
    發(fā)表于 10-30 09:28 ?15次下載
    ARM Bootloader 的實(shí)現(xiàn)<b class='flag-5'>C</b> 和 ASM <b class='flag-5'>混合編程</b>

    MATLAB和C++混合編程入門資料說(shuō)明

    為進(jìn)行MATLAB/C++混合編程,需要安裝MATLAB和C++ 編譯器。windows環(huán)境下通常選擇Visual C++(以下簡(jiǎn)稱VC)作為c++
    發(fā)表于 01-15 16:12 ?21次下載
    MATLAB和<b class='flag-5'>C++</b><b class='flag-5'>混合編程</b>入門資料說(shuō)明

    單片機(jī)C語(yǔ)言和匯編語(yǔ)言混合編程實(shí)例詳解

    單片機(jī)C語(yǔ)言和匯編語(yǔ)言混合編程實(shí)例詳解
    發(fā)表于 08-16 09:50 ?227次下載

    海思AI芯片(Hi3519A/3559A)方案學(xué)習(xí)(二十一)extern "C"和C/C++混合編程

    本系列為華為海思海思AI芯片(Hi3519A/3559A)方案學(xué)習(xí)系列之二十一,系列文章請(qǐng)關(guān)注海思AI芯片方案學(xué)習(xí)。作者:ltshan139
    發(fā)表于 01-26 18:44 ?2次下載
    海思AI芯片(Hi3519A/3559A)方案學(xué)習(xí)(二十一)extern "<b class='flag-5'>C</b>"和<b class='flag-5'>C</b>/<b class='flag-5'>C++</b><b class='flag-5'>混合編程</b>