一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

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

C與C++如何互相調(diào)用

3D視覺工坊 ? 來源:3D視覺工坊 ? 2023-01-15 14:50 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

在項目開發(fā)過程中,我們底層代碼經(jīng)常用C來實現(xiàn),而上層應用大都會用C++實現(xiàn),這樣我們就涉及到了CC++相互調(diào)用的情況了。那么,C/C++如何實現(xiàn)相互調(diào)用呢?

1、為什么會有差異?

1)編譯方式不同C文件常采用gcc編譯,而Cpp文件常采用g++來編譯2)C++支持函數(shù)重載:由于這一特性,C++C中的同一個函數(shù),經(jīng)過編譯后,生成的函數(shù)名稱是不同的。 這樣就導致了CC++之間不能直接進行調(diào)用,要解決這一問題,就得靠extern "C"來輔助了。

2、extern "C"

·externextern關鍵字我們并不陌生,它是編程語言中的一種屬性,用來表示變量,函數(shù)等類型的作用范圍。
我們經(jīng)常在.c源文件中定義變量或者實現(xiàn)函數(shù),在.h頭文件中使用extern關鍵字進行聲明,方便其他文件調(diào)用。
·"C"編程語言種類繁多,不同語言有不同的編譯規(guī)則,如果想要互相調(diào)用,必須告訴編譯器以什么規(guī)則去編譯文件,這樣才能正常調(diào)用。其主要作用是:把“C”當作一個標志位,告訴編譯器,下面代碼以C的方式編譯!
了解其中原理后,我們來實操一下!

3、C++調(diào)用C

我們創(chuàng)建3個文件,分別為main.cppcal.c、cal.h

e8415ed6-9431-11ed-bfe3-dac502259ad0.jpg

我們分別使用gccg++單獨編譯文件,編譯出cal.omain.o兩個中間文件,很簡單,定義了一個embedded_art的函數(shù)。

	# dong @ ubuntu in ~/WorkSpace/Donge_Programs/Unix_Programming_Learning/c_c++_call_test on git:main x [1532]  $ ls cal.c cal.h main.cpp # dong @ ubuntu in ~/WorkSpace/Donge_Programs/Unix_Programming_Learning/c_c++_call_test on git:main x [1543]  $ gcc -c cal.c # dong @ ubuntu in ~/WorkSpace/Donge_Programs/Unix_Programming_Learning/c_c++_call_test on git:main x [1549]  $ g++ -c main.cpp # dong @ ubuntu in ~/WorkSpace/Donge_Programs/Unix_Programming_Learning/c_c++_call_test on git:main x [1555]  $ ls cal.c cal.h cal.o main.cpp main.o下面看一下編譯之后的中間文件cal.omain.o的符號表,看看同一個函數(shù)embedded_art不同編譯方式之后的差別。
		

e8531202-9431-11ed-bfe3-dac502259ad0.jpg

可以看到,g++編譯之后,對函數(shù)名稱進行了加工,按照自身的編譯規(guī)則,最終生成了一個新的函數(shù)名,所以我們?nèi)绻苯诱{(diào)用cal.c中的embedded_art肯定是不行的。

正確方式

使用extern "C"來使g++編譯器用C的方式編譯。main.cpp文件中,我們引入cal.h的位置,添加extern "C"

	extern "C" { #include "cal.h" }再次進行編譯,即可!
		

e86156b4-9431-11ed-bfe3-dac502259ad0.jpg

可以看到符號表中,該函數(shù)名稱正常,然后我們將中間文件鏈接起來,執(zhí)行,輸出正確結果!

	# dong @ ubuntu in ~/WorkSpace/Donge_Programs/Unix_Programming_Learning/c_c++_call_test on git:main x [1636]  $ g++ main.o cal.o # dong @ ubuntu in ~/WorkSpace/Donge_Programs/Unix_Programming_Learning/c_c++_call_test on git:main x [1654]  $ ls a.out cal.c cal.h cal.o main.cpp main.o # dong @ ubuntu in ~/WorkSpace/Donge_Programs/Unix_Programming_Learning/c_c++_call_test on git:main x [1657]  $ ./a.out main entry 嵌入式藝術

4、C調(diào)用C++

我們創(chuàng)建3個文件,分別為main.ccal.cpp、cal.h。

e87635a2-9431-11ed-bfe3-dac502259ad0.jpg

我們分別使用gccg++單獨編譯文件,編譯出cal.omain.o兩個中間文件,很簡單,同樣定義了一個embedded_art的函數(shù)。

	# dong @ ubuntu in ~/WorkSpace/Donge_Programs/Unix_Programming_Learning/c_c++_call_test/c_call_c++ on git:main x [1645]  $ g++ -c cal.cpp # dong @ ubuntu in ~/WorkSpace/Donge_Programs/Unix_Programming_Learning/c_c++_call_test/c_call_c++ on git:main x [1652]  $ gcc -c main.c # dong @ ubuntu in ~/WorkSpace/Donge_Programs/Unix_Programming_Learning/c_c++_call_test/c_call_c++ on git:main x [1656]  $ ls cal.cpp cal.h cal.o main.c main.o下面看一下編譯之后的中間文件cal.omain.o的符號表,看看同一個函數(shù)embedded_art不同編譯方式之后的差別。
		

e884e37c-9431-11ed-bfe3-dac502259ad0.jpg

同樣,不同的編譯器處理方式不同,函數(shù)名稱依舊不同!同樣,需要加入extern "C"來告訴編譯器按C的方式編譯。我們在cal.h的聲明部分添加,然后重新編譯!

	extern "C" { extern void embedded_art(void); }
		

e8926448-9431-11ed-bfe3-dac502259ad0.jpg

可以看到符號表中,該函數(shù)名稱正常,然后我們將中間文件鏈接起來。

e8a24b1a-9431-11ed-bfe3-dac502259ad0.jpg

這個時候,會出現(xiàn)報錯extern "C",這是什么情況?main.c文件中,引入了c++的頭文件cal.h,因為"C"C++編譯的時候才能識別,C語言中并沒有這個關鍵字。所以,我們需要在g++編譯的時候去加入extern "C",而gcc編譯的時候跳過,這個時候就要提到c++編譯時候的特定宏__cplusplus了,相當于一個閥門了。我們修改cal.h文件

	#ifdef __cplusplus extern "C" { #endif  extern void embedded_art(void); #ifdef __cplusplus } #endif這樣就確保了,c++編譯embedded_art函數(shù)的時候,采用C語法編譯,而gcc編譯的時候,不作處理。再次鏈接,執(zhí)行!

	# dong @ ubuntu in ~/WorkSpace/Donge_Programs/Unix_Programming_Learning/c_c++_call_test/c_call_c++ on git:main x [1606] C:1 $ gcc -no-pie cal.o main.o -o main # dong @ ubuntu in ~/WorkSpace/Donge_Programs/Unix_Programming_Learning/c_c++_call_test/c_call_c++ on git:main x [1646]  $ ls cal.cpp cal.h cal.o main main.c main.o # dong @ ubuntu in ~/WorkSpace/Donge_Programs/Unix_Programming_Learning/c_c++_call_test/c_call_c++ on git:main x [1601]  $ ./main main entry 嵌入式藝術

5、總結

C/C++之間的相互調(diào)用,歸根到底就是:不同的語言有不同的編譯規(guī)則,要想實現(xiàn)通用,就必須告訴編譯器,按照目標語言的規(guī)則進行編譯!

審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 函數(shù)
    +關注

    關注

    3

    文章

    4381

    瀏覽量

    64897
  • C++
    C++
    +關注

    關注

    22

    文章

    2119

    瀏覽量

    75328
  • 編譯器
    +關注

    關注

    1

    文章

    1662

    瀏覽量

    50228
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    主流的 MCU 開發(fā)語言為什么是 C 而不是 C++?

    在單片機的地界兒里,C語言穩(wěn)坐中軍帳,C++想分杯羹?難嘍。咱電子工程師天天跟那針尖大的內(nèi)存空間較勁,C++那些花里胡哨的玩意兒,在這兒真玩不轉(zhuǎn)。先說內(nèi)存這道坎兒。您當stm32f4的256kRAM
    的頭像 發(fā)表于 05-21 10:33 ?448次閱讀
    主流的 MCU 開發(fā)語言為什么是 <b class='flag-5'>C</b> 而不是 <b class='flag-5'>C++</b>?

    Spire.XLS for C++組件說明

    Spire.XLS for C++ 是一款專業(yè)的 C++ Excel 組件,可以用在各種 C++ 框架和應用程序中。Spire.XLS for C++ 提供了一個對象模型 Excel
    的頭像 發(fā)表于 01-14 09:40 ?630次閱讀
    Spire.XLS for <b class='flag-5'>C++</b>組件說明

    EE-128:C語言中的DSP:從C調(diào)用匯編類成員函數(shù)

    電子發(fā)燒友網(wǎng)站提供《EE-128:C語言中的DSP:從C調(diào)用匯編類成員函數(shù).pdf》資料免費下載
    發(fā)表于 01-07 13:48 ?0次下載
    EE-128:<b class='flag-5'>C</b>語言中的DSP:從<b class='flag-5'>C</b><b class='flag-5'>調(diào)用</b>匯編類成員函數(shù)

    AKI跨語言調(diào)用庫神助攻C/C++代碼遷移至HarmonyOS NEXT

    /C++代碼快速遷移至HarmonyOS NEXT。憑借卓越的兼容性,AKI已成為廠商與開發(fā)者打造鴻蒙原生應用過程中廣泛使用的跨語言調(diào)用解決方案。 AKI是一款專為鴻蒙原生開發(fā)設計的FFI(外部函數(shù)接口
    發(fā)表于 01-02 17:08

    同樣是函數(shù),在CC++中有什么區(qū)別

    同樣是函數(shù),在 CC++ 中有什么區(qū)別? 第一個返回值。 C語言的函數(shù)可以不寫返回值類型,編譯器會默認為返回 int。 但是 C++ 的函數(shù),除了構造和析構這兩個特殊的函數(shù),必須
    的頭像 發(fā)表于 11-29 10:25 ?913次閱讀

    C7000 C/C++優(yōu)化指南用戶手冊

    電子發(fā)燒友網(wǎng)站提供《C7000 C/C++優(yōu)化指南用戶手冊.pdf》資料免費下載
    發(fā)表于 11-09 15:00 ?0次下載
    <b class='flag-5'>C</b>7000 <b class='flag-5'>C</b>/<b class='flag-5'>C++</b>優(yōu)化指南用戶手冊

    MSP430優(yōu)化C/C++編譯器v21.6.0.LTS

    電子發(fā)燒友網(wǎng)站提供《MSP430優(yōu)化C/C++編譯器v21.6.0.LTS.pdf》資料免費下載
    發(fā)表于 11-08 14:57 ?0次下載
    MSP430優(yōu)化<b class='flag-5'>C</b>/<b class='flag-5'>C++</b>編譯器v21.6.0.LTS

    ARM優(yōu)化C/C++編譯器 v20.2.0.LTS

    電子發(fā)燒友網(wǎng)站提供《ARM優(yōu)化C/C++編譯器 v20.2.0.LTS.pdf》資料免費下載
    發(fā)表于 11-07 10:46 ?0次下載
    ARM優(yōu)化<b class='flag-5'>C</b>/<b class='flag-5'>C++</b>編譯器 v20.2.0.LTS

    TMS320C6000優(yōu)化C/C++編譯器v8.3.x

    電子發(fā)燒友網(wǎng)站提供《TMS320C6000優(yōu)化C/C++編譯器v8.3.x.pdf》資料免費下載
    發(fā)表于 11-01 09:35 ?1次下載
    TMS320<b class='flag-5'>C</b>6000優(yōu)化<b class='flag-5'>C</b>/<b class='flag-5'>C++</b>編譯器v8.3.x

    TMS320C28x優(yōu)化C/C++編譯器v22.6.0.LTS

    電子發(fā)燒友網(wǎng)站提供《TMS320C28x優(yōu)化C/C++編譯器v22.6.0.LTS.pdf》資料免費下載
    發(fā)表于 10-31 10:10 ?0次下載
    TMS320<b class='flag-5'>C</b>28x優(yōu)化<b class='flag-5'>C</b>/<b class='flag-5'>C++</b>編譯器v22.6.0.LTS

    C語言和C++中結構體的區(qū)別

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

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

    電子發(fā)燒友網(wǎng)站提供《C7000優(yōu)化C/C++編譯器.pdf》資料免費下載
    發(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>編譯器

    基于OpenHarmony標準系統(tǒng)的C++公共基礎類庫案例:SafeMap

    1、程序簡介該程序是基于OpenHarmony的C++公共基礎類庫的安全關聯(lián)容器:SafeMap。OpenHarmony提供了一個線程安全的map實現(xiàn)。SafeMap在STLmap基礎上封裝互斥鎖
    的頭像 發(fā)表于 08-30 12:42 ?772次閱讀
    基于OpenHarmony標準系統(tǒng)的<b class='flag-5'>C++</b>公共基礎類庫案例:SafeMap

    OpenVINO2024 C++推理使用技巧

    很多人都使用OpenVINO新版的C++ 或者Python的SDK,都覺得非常好用,OpenVINO2022之后的版本C++ SDK做了大量的優(yōu)化與整理,已經(jīng)是非常貼近開發(fā)的使用習慣與推理方式。與OpenCV的Mat對象對接方式更是幾乎無縫對接,非常的方便好用。
    的頭像 發(fā)表于 07-26 09:20 ?1574次閱讀

    C++語言基礎知識

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