国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

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

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

3天內不再提示

C與C++如何互相調用

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

掃碼添加小助手

加入工程師交流群

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

1、為什么會有差異?

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

2、extern "C"

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

3、C++調用C

我們創建3個文件,分別為main.cppcal.ccal.h

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

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

	# 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的符號表,看看同一個函數embedded_art不同編譯方式之后的差別。
		

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

可以看到,g++編譯之后,對函數名稱進行了加工,按照自身的編譯規則,最終生成了一個新的函數名,所以我們如果直接調用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

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

	# 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調用C++

我們創建3個文件,分別為main.ccal.cppcal.h

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

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

	# 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的符號表,看看同一個函數embedded_art不同編譯方式之后的差別。
		

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

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

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

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

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

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

這個時候,會出現報錯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函數的時候,采用C語法編譯,而gcc編譯的時候,不作處理。再次鏈接,執行!

	# 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++之間的相互調用,歸根到底就是:不同的語言有不同的編譯規則,要想實現通用,就必須告訴編譯器,按照目標語言的規則進行編譯!

審核編輯 :李倩


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

    關注

    3

    文章

    4417

    瀏覽量

    67516
  • C++
    C++
    +關注

    關注

    22

    文章

    2124

    瀏覽量

    77120
  • 編譯器
    +關注

    關注

    1

    文章

    1672

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    keil實現cc++混合編程

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

    汽車網絡安全開發語言選型指南:C/C++/Rust/Java等主流語言對比+Perforce QAC/Klocwork工具支持

    汽車網絡安全如何選編程語言?CC++、Rust、Java……誰更適合AUTOSAR、ISO/SAE 21434?一文了解8種主流語言的優劣與適用場景,以及Perforce QAC/Klocwork對MISRA、CERT等規范的支持。
    的頭像 發表于 12-26 11:13 ?432次閱讀
    汽車網絡安全開發語言選型指南:<b class='flag-5'>C</b>/<b class='flag-5'>C++</b>/Rust/Java等主流語言對比+Perforce QAC/Klocwork工具支持

    C語言與C++的區別及聯系

    C語言和C++到底是什么關系? 首先C++C語言本來就是兩種不同的編程語言,但C++確實是對C
    發表于 12-24 07:23

    CC++之間的聯系

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

    C語言和C++之間的區別是什么

    區別 1、面向對象編程 (OOP): C語言是一種面向過程的語言,它強調的是通過函數將任務分解為一系列步驟進行執行。 C++C語言的基礎上擴展了面向對象的特性,支持類(class)、封裝、繼承
    發表于 12-11 06:23

    C/C++條件編譯

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

    C++程序異常的處理機制

    1、什么是異常處理? 有經驗的朋友應該知道,在正常的CC++編程過程中難免會碰到程序不按照原本設計運行的情況。 最常見的有除法分母為零,數組越界,內存分配失效、打開相應文件失敗等等。 一個程序
    發表于 12-02 07:12

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

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

    C/C++代碼靜態測試工具Perforce QAC 2025.3的新特性

    ?Perforce Validate?中?QAC?項目的相對/根路徑的支持。C++?分析也得到了增強,增加了用于檢測 C++?并發問題的新檢查,并改進了實體名稱和實
    的頭像 發表于 10-13 18:11 ?573次閱讀
    <b class='flag-5'>C</b>/<b class='flag-5'>C++</b>代碼靜態測試工具Perforce QAC 2025.3的新特性

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

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

    C++ 與 Python:樹莓派上哪種語言更優?

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

    Perforce QAC產品簡介:面向C/C++的靜態代碼分析工具(已通過SO 26262認證)

    Perforce QAC專為C/C++開發者打造,支持多種編碼規范、功能安全標準(ISO 26262)等,廣泛用于汽車、醫療、嵌入式開發領域,可幫助快速識別關鍵缺陷、提升代碼質量、實現合規交付。
    的頭像 發表于 07-10 15:57 ?1274次閱讀
    Perforce QAC產品簡介:面向<b class='flag-5'>C</b>/<b class='flag-5'>C++</b>的靜態代碼分析工具(已通過SO 26262認證)

    基于LockAI視覺識別模塊:C++目標檢測

    本文檔基于瑞芯微RV1106的LockAI凌智視覺識別模塊,通過C++語言做的目標檢測實驗。本文檔展示了如何使用lockzhiner_vision_module::PaddleDet類進行目標檢測,并通過lockzhiner_vision_module::Visualize函數將檢測結果可視
    的頭像 發表于 06-06 13:56 ?842次閱讀
    基于LockAI視覺識別模塊:<b class='flag-5'>C++</b>目標檢測

    主流的 MCU 開發語言為什么是 C 而不是 C++

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

    C++學到什么程度可以找工作?

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