91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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與C++如何互相調(diào)用

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

掃碼添加小助手

加入工程師交流群

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

1、為什么會(huì)有差異?

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

2、extern "C"

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

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

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

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

我們分別使用gccg++單獨(dú)編譯文件,編譯出cal.omain.o兩個(gè)中間文件,很簡(jiǎn)單,定義了一個(gè)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的符號(hào)表,看看同一個(gè)函數(shù)embedded_art不同編譯方式之后的差別。
		

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

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

正確方式

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

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

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

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

	# 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 嵌入式藝術(shù)

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

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

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

我們分別使用gccg++單獨(dú)編譯文件,編譯出cal.omain.o兩個(gè)中間文件,很簡(jiǎn)單,同樣定義了一個(gè)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的符號(hào)表,看看同一個(gè)函數(shù)embedded_art不同編譯方式之后的差別。
		

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

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

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

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

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

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

這個(gè)時(shí)候,會(huì)出現(xiàn)報(bào)錯(cuò)extern "C",這是什么情況?main.c文件中,引入了c++的頭文件cal.h,因?yàn)?/span>"C"C++編譯的時(shí)候才能識(shí)別,C語(yǔ)言中并沒(méi)有這個(gè)關(guān)鍵字。所以,我們需要在g++編譯的時(shí)候去加入extern "C",而gcc編譯的時(shí)候跳過(guò),這個(gè)時(shí)候就要提到c++編譯時(shí)候的特定宏__cplusplus了,相當(dāng)于一個(gè)閥門了。我們修改cal.h文件

	#ifdef __cplusplus extern "C" { #endif  extern void embedded_art(void); #ifdef __cplusplus } #endif這樣就確保了,c++編譯embedded_art函數(shù)的時(shí)候,采用C語(yǔ)法編譯,而gcc編譯的時(shí)候,不作處理。再次鏈接,執(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 嵌入式藝術(shù)

5、總結(jié)

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

審核編輯 :李倩


聲明:本文內(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)投訴
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4417

    瀏覽量

    67545
  • C++
    C++
    +關(guān)注

    關(guān)注

    22

    文章

    2124

    瀏覽量

    77143
  • 編譯器
    +關(guān)注

    關(guān)注

    1

    文章

    1672

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    keil實(shí)現(xiàn)cc++混合編程

    參考touchgfx生成的代碼,發(fā)現(xiàn)了一個(gè)不需要添加--cpp11 參數(shù)的解決方法,具體操作如下。 一、創(chuàng)建一個(gè)空白的C文件和頭文件在頭文件中定義c++文件中需要調(diào)用的函數(shù),如圖所示 二、在
    發(fā)表于 01-26 08:58

    汽車網(wǎng)絡(luò)安全開(kāi)發(fā)語(yǔ)言選型指南:C/C++/Rust/Java等主流語(yǔ)言對(duì)比+Perforce QAC/Klocwork工具支持

    汽車網(wǎng)絡(luò)安全如何選編程語(yǔ)言?C、C++、Rust、Java……誰(shuí)更適合AUTOSAR、ISO/SAE 21434?一文了解8種主流語(yǔ)言的優(yōu)劣與適用場(chǎng)景,以及Perforce QAC/Klocwork對(duì)MISRA、CERT等規(guī)范的支持。
    的頭像 發(fā)表于 12-26 11:13 ?442次閱讀
    汽車網(wǎng)絡(luò)安全開(kāi)發(fā)語(yǔ)言選型指南:<b class='flag-5'>C</b>/<b class='flag-5'>C++</b>/Rust/Java等主流語(yǔ)言對(duì)比+Perforce QAC/Klocwork工具支持

    C語(yǔ)言與C++的區(qū)別及聯(lián)系

    C語(yǔ)言和C++到底是什么關(guān)系? 首先C++C語(yǔ)言本來(lái)就是兩種不同的編程語(yǔ)言,但C++確實(shí)是對(duì)C
    發(fā)表于 12-24 07:23

    CC++之間的聯(lián)系

    1、語(yǔ)法兼容性: C++完全兼容C語(yǔ)言的語(yǔ)法,這意味著任何有效的C語(yǔ)言程序都可以直接在C++編譯器下編譯通過(guò)。 2、底層控制: C++
    發(fā)表于 12-11 06:51

    C語(yǔ)言和C++之間的區(qū)別是什么

    區(qū)別 1、面向?qū)ο缶幊?(OOP): C語(yǔ)言是一種面向過(guò)程的語(yǔ)言,它強(qiáng)調(diào)的是通過(guò)函數(shù)將任務(wù)分解為一系列步驟進(jìn)行執(zhí)行。 C++C語(yǔ)言的基礎(chǔ)上擴(kuò)展了面向?qū)ο蟮奶匦?,支持?class)、封裝、繼承
    發(fā)表于 12-11 06:23

    C/C++條件編譯

    條件編譯是一種在編譯時(shí)根據(jù)條件選擇性地包含或排除部分代碼的處理方法。在 C/C++ 中,條件編譯使用預(yù)處理指令 #ifdef、#endif、#else 和 #elif 來(lái)實(shí)現(xiàn)。常用的條件編譯指令有
    發(fā)表于 12-05 06:21

    C++程序異常的處理機(jī)制

    1、什么是異常處理? 有經(jīng)驗(yàn)的朋友應(yīng)該知道,在正常的CC++編程過(guò)程中難免會(huì)碰到程序不按照原本設(shè)計(jì)運(yùn)行的情況。 最常見(jiàn)的有除法分母為零,數(shù)組越界,內(nèi)存分配失效、打開(kāi)相應(yīng)文件失敗等等。 一個(gè)程序
    發(fā)表于 12-02 07:12

    嵌入式C/C++回歸測(cè)試四大最佳實(shí)踐(附自動(dòng)化測(cè)試工具TESSY使用教程)

    嵌入式開(kāi)發(fā)中,一次微小的代碼改動(dòng)都可能引發(fā)“蝴蝶效應(yīng)”,如何守護(hù)系統(tǒng)的穩(wěn)健?推薦專業(yè)的自動(dòng)化測(cè)試工具#TESSY,源自戴姆勒-奔馳,是嵌入式C/C++單元/集成測(cè)試的標(biāo)桿。
    的頭像 發(fā)表于 10-31 14:21 ?417次閱讀
    嵌入式<b class='flag-5'>C</b>/<b class='flag-5'>C++</b>回歸測(cè)試四大最佳實(shí)踐(附自動(dòng)化測(cè)試工具TESSY使用教程)

    C/C++代碼靜態(tài)測(cè)試工具Perforce QAC 2025.3的新特性

    ?Perforce Validate?中?QAC?項(xiàng)目的相對(duì)/根路徑的支持。C++?分析也得到了增強(qiáng),增加了用于檢測(cè) C++?并發(fā)問(wèn)題的新檢查,并改進(jìn)了實(shí)體名稱和實(shí)
    的頭像 發(fā)表于 10-13 18:11 ?575次閱讀
    <b class='flag-5'>C</b>/<b class='flag-5'>C++</b>代碼靜態(tài)測(cè)試工具Perforce QAC 2025.3的新特性

    技能+1!如何在樹(shù)莓派上使用C++控制GPIO?

    在使用樹(shù)莓派時(shí),你會(huì)發(fā)現(xiàn)Python和Scratch是許多任務(wù)(包括GPIO編程)中最常用的編程語(yǔ)言。但你知道嗎,你也可以使用C++進(jìn)行GPIO編程,而且這樣做還有不少好處。借助WiringPi
    的頭像 發(fā)表于 08-06 15:33 ?4164次閱讀
    技能+1!如何在樹(shù)莓派上使用<b class='flag-5'>C++</b>控制GPIO?

    C++ 與 Python:樹(shù)莓派上哪種語(yǔ)言更優(yōu)?

    Python是樹(shù)莓派上的首選編程語(yǔ)言,我們的大部分教程都使用它。然而,C++在物聯(lián)網(wǎng)項(xiàng)目中同樣廣受歡迎且功能強(qiáng)大。那么,在樹(shù)莓派項(xiàng)目中選擇哪種語(yǔ)言更合適呢?Python因其簡(jiǎn)潔性、豐富的庫(kù)和資源而被
    的頭像 發(fā)表于 07-24 15:32 ?956次閱讀
    <b class='flag-5'>C++</b> 與 Python:樹(shù)莓派上哪種語(yǔ)言更優(yōu)?

    Perforce QAC產(chǎn)品簡(jiǎn)介:面向C/C++的靜態(tài)代碼分析工具(已通過(guò)SO 26262認(rèn)證)

    Perforce QAC專為C/C++開(kāi)發(fā)者打造,支持多種編碼規(guī)范、功能安全標(biāo)準(zhǔn)(ISO 26262)等,廣泛用于汽車、醫(yī)療、嵌入式開(kāi)發(fā)領(lǐng)域,可幫助快速識(shí)別關(guān)鍵缺陷、提升代碼質(zhì)量、實(shí)現(xiàn)合規(guī)交付。
    的頭像 發(fā)表于 07-10 15:57 ?1287次閱讀
    Perforce QAC產(chǎn)品簡(jiǎn)介:面向<b class='flag-5'>C</b>/<b class='flag-5'>C++</b>的靜態(tài)代碼分析工具(已通過(guò)SO 26262認(rèn)證)

    基于LockAI視覺(jué)識(shí)別模塊:C++目標(biāo)檢測(cè)

    本文檔基于瑞芯微RV1106的LockAI凌智視覺(jué)識(shí)別模塊,通過(guò)C++語(yǔ)言做的目標(biāo)檢測(cè)實(shí)驗(yàn)。本文檔展示了如何使用lockzhiner_vision_module::PaddleDet類進(jìn)行目標(biāo)檢測(cè),并通過(guò)lockzhiner_vision_module::Visualize函數(shù)將檢測(cè)結(jié)果可視
    的頭像 發(fā)表于 06-06 13:56 ?848次閱讀
    基于LockAI視覺(jué)識(shí)別模塊:<b class='flag-5'>C++</b>目標(biāo)檢測(cè)

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

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

    C++學(xué)到什么程度可以找工作?

    C++學(xué)到什么程度可以找工作?要使用C++找到工作,特別是作為軟件開(kāi)發(fā)人員或相關(guān)職位,通常需要掌握以下幾個(gè)方面: 1. **語(yǔ)言基礎(chǔ)**:你需要對(duì)C++的核心概念有扎實(shí)的理解,包括但不限于指針、內(nèi)存
    發(fā)表于 03-13 10:19