色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

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

汽車電子技術 ? 來源:IOT物聯網小鎮 ? 作者: 道哥 ? 2023-02-14 13:48 ? 次閱讀

這篇文章講解的知識點很“小”,但是在C和C++的混合編程中非常重要。因為我們在寫應用程序時,經常利用到第三方的程序。如果我們的代碼用C,但是第三方代碼是C++;或者我們的代碼用C++,而第三方的代碼是C,那么在整合的時候就需要仔細一點了。

一、C調用C++中的函數

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

圖片

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

圖片

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

圖片

知識點:

(1)關于 __cplusplus

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

(2)關于 extern "C"

CC++編譯器,在編譯一個函數的時候,編譯策略是不同的。C++會對函數的名稱進行改寫(而且每個C++編譯器對于名字改寫的規則也是不一樣的,甚至同一個編譯器的不同版本的名字改寫規則也不一樣,因此,使用C++時最好用相同的編譯器版本對項目中的所有模塊進行編譯。補充:改寫的目的是為了實現C++語言中的函數重載)。



在callee.h中,把函數 cpp_hello 放在 extern "C" 中,意思就是告訴編譯器g++: 這個函數是需要被C調用的,請不要對這個函數進行名字改寫。



可以通過 nm 指令查看一下目標文件callee.o中的符號:

圖片

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

圖片

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

圖片

  1. 編譯主調用C文件,得到可執行文件

圖片

知識點:

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

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

二、C++調用C中的函數

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

圖片

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

圖片

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

圖片

知識點:

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

圖片

  1. 編譯主調用C++文件,得到可執行文件

圖片

知識點:

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

三、總結

  1. 在C++代碼的函數聲明時,如果代碼會被C程序調用,一定要加上 extern "C"。
  2. 在C代碼的函數聲明時,如果代碼會被C++程序調用,也要加上extern "C"。
  3. 在用C++編程時,最好各模塊統一使用相同的編譯器,包括版本最好也相同。
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • C++
    C++
    +關注

    關注

    22

    文章

    2108

    瀏覽量

    73618
  • 代碼
    +關注

    關注

    30

    文章

    4779

    瀏覽量

    68521
  • 應用程序
    +關注

    關注

    37

    文章

    3265

    瀏覽量

    57677
收藏 人收藏

    評論

    相關推薦

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

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

    Matlab與C/C++ 混合編程技術總結的太棒了

    在工程實踐中,用戶經常遇到Matlab 與C/C++混合編程的問題。本文基于Matlab 6.5和VC6.0 開發環境,在Windows 平臺下就它們之間的混合編程問題進行深入研究并舉
    發表于 04-26 06:42

    STM32c/c++混合編程

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

    ARM匯編與C混合編程的相關資料分享

    慕課電子科技大學.嵌入式系統.第五章.ARM匯編程序設計.ARM匯編與C混合編程0 目錄5 ARM匯編程序設計5.3 ARM匯編與C
    發表于 11-09 06:17

    RT-Thread如何實現C\C++混合編譯?要在哪里修改GCC的鏈接腳本?

    RT-Thread的工程要將外部C++的算法程序移植進來混合編譯,C++程序有xxx.h,xxx.cpp兩個源文件,直接使用build.sh報了很多錯誤,肯定無法編譯!已經做過如下實驗:1.目前我
    發表于 03-22 14:41

    C語言和匯編語言混合編程方法和C語言中斷處理方法

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

    Matlab與C混合編程匯總

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

    C_與Matlab混合編程在BEAM繪制中的應用_范嬋嬌

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

    MSP430單片機的C語言和匯編語言混合編程

    MSP430單片機的C語言和匯編語言混合編程
    發表于 10-13 08:35 ?24次下載
    MSP430單片機的<b class='flag-5'>C</b>語言和匯編語言<b class='flag-5'>混合編程</b>

    Matlab與C/C++混合編程接口及應用方法解析

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

    淺談關于DSP6000中C/C++語言和匯編語言的混合編程的方法

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

    ARM Bootloader 的實現C 和 ASM 混合編程

    ARM Bootloader 的實現C 和 ASM 混合編程
    發表于 10-30 09:28 ?15次下載
    ARM Bootloader 的實現<b class='flag-5'>C</b> 和 ASM <b class='flag-5'>混合編程</b>

    MATLAB和C++混合編程入門資料說明

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

    單片機C語言和匯編語言混合編程實例詳解

    單片機C語言和匯編語言混合編程實例詳解
    發表于 08-16 09:50 ?225次下載

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

    本系列為華為海思海思AI芯片(Hi3519A/3559A)方案學習系列之二十一,系列文章請關注海思AI芯片方案學習。作者:ltshan139
    發表于 01-26 18:44 ?2次下載
    海思AI芯片(Hi3519A/3559A)方案學習(二十一)extern "<b class='flag-5'>C</b>"和<b class='flag-5'>C</b>/<b class='flag-5'>C++</b><b class='flag-5'>混合編程</b>
    主站蜘蛛池模板: 欧美成a人片免费看久久| 中文字幕无码乱人伦蜜桃| 国产 有码 无码 电影| 深爱激情站| 九九免费的视频| 99re.05久久热最新地址| 午夜在线观看免费完整直播网页 | 美女白虎穴| 和搜子的日子 在线观看| 国产精品久久久久久亚洲影视| youjizz护士| 99久久亚洲综合精品| 97午夜精品| 97在线观看成人免费视频| 18禁止观看免费私人影院| 99re6热这里在线精品视频| 亚洲精品高清中文字幕完整版| 亚洲午夜久久久精品电影院 | 国产69TV精品久久久久99| 吃寂寞寡妇的奶| 草莓视频在线看免费高清观看| 精品免费久久久久久成人影院| 免费啪视频观试看视频| 亚洲成人一区二区| 国产成人精品视频频| 嫩草影院地址一二三| 国产VA精品午夜福利视频| 97国产在线播放| 国产毛A片久久久久久无码| 日本精油按摩| 岛国大片在线播放免费| 亚洲黄色在线视频| 亚洲性无码AV久久成人| 51精品少妇人妻AV一区二区| 久拍国产在线观看| 91涩涩视频| 日本高清无吗| 国产精品1卡二卡三卡四卡乱码 | 99久久精品国产国产毛片| 直插下身完整的欧美版| 高清观看ZSHH96的视频素材|