在項(xiàng)目開發(fā)過程中,我們底層代碼經(jīng)常用C
來實(shí)現(xiàn),而上層應(yīng)用大都會(huì)用C++
實(shí)現(xiàn),這樣我們就涉及到了C
和C++
相互調(diào)用的情況了。那么,C/C++
如何實(shí)現(xiàn)相互調(diào)用呢?
1、為什么會(huì)有差異?
1)編譯方式不同:C
文件常采用gcc
編譯,而Cpp
文件常采用g++
來編譯2)C++
支持函數(shù)重載:由于這一特性,C++
和C
中的同一個(gè)函數(shù),經(jīng)過編譯后,生成的函數(shù)名稱是不同的。
這樣就導(dǎo)致了C
與C++
之間不能直接進(jìn)行調(diào)用,要解決這一問題,就得靠extern "C"
來輔助了。2、extern "C"
·externextern
關(guān)鍵字我們并不陌生,它是編程語言中的一種屬性,用來表示變量,函數(shù)等類型的作用范圍。
我們經(jīng)常在·"C"編程語言種類繁多,不同語言有不同的編譯規(guī)則,如果想要互相調(diào)用,必須告訴編譯器以什么規(guī)則去編譯文件,這樣才能正常調(diào)用。其主要作用是:把.c
源文件中定義變量或者實(shí)現(xiàn)函數(shù),在.h
頭文件中使用extern
關(guān)鍵字進(jìn)行聲明,方便其他文件調(diào)用。
“C”
當(dāng)作一個(gè)標(biāo)志位,告訴編譯器,下面代碼以C
的方式編譯!了解其中原理后,我們來實(shí)操一下!
3、C++調(diào)用C
我們創(chuàng)建3個(gè)文件,分別為main.cpp
、cal.c
、cal.h
。
gcc
和g++
單獨(dú)編譯文件,編譯出cal.o
和main.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.o
和main.o
的符號(hào)表,看看同一個(gè)函數(shù)embedded_art
不同編譯方式之后的差別。
g++
編譯之后,對(duì)函數(shù)名稱進(jìn)行了加工,按照自身的編譯規(guī)則,最終生成了一個(gè)新的函數(shù)名,所以我們?nèi)绻苯诱{(diào)用cal.c
中的embedded_art
肯定是不行的。正確方式
使用extern "C"
來使g++
編譯器用C
的方式編譯。在main.cpp
文件中,我們引入cal.h
的位置,添加extern "C"
extern "C" { #include "cal.h" }
再次進(jìn)行編譯,即可!
# 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
。
gcc
和g++
單獨(dú)編譯文件,編譯出cal.o
和main.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.o
和main.o
的符號(hào)表,看看同一個(gè)函數(shù)embedded_art
不同編譯方式之后的差別。
extern "C"
來告訴編譯器按C
的方式編譯。我們?cè)?/span>cal.h
的聲明部分添加,然后重新編譯!extern "C" { extern void embedded_art(void); }
extern "C"
,這是什么情況?在main.c
文件中,引入了c++
的頭文件cal.h
,因?yàn)?/span>"C"
在C++
編譯的時(shí)候才能識(shí)別,C
語言中并沒有這個(gè)關(guān)鍵字。所以,我們需要在g++
編譯的時(shí)候去加入extern "C"
,而gcc
編譯的時(shí)候跳過,這個(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
語法編譯,而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)用,歸根到底就是:不同的語言有不同的編譯規(guī)則,要想實(shí)現(xiàn)通用,就必須告訴編譯器,按照目標(biāo)語言的規(guī)則進(jìn)行編譯!
審核編輯 :李倩
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。
舉報(bào)投訴
-
函數(shù)
+關(guān)注
關(guān)注
3文章
4380瀏覽量
64850 -
C++
+關(guān)注
關(guān)注
22文章
2119瀏覽量
75293 -
編譯器
+關(guān)注
關(guān)注
1文章
1662瀏覽量
50208
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
熱點(diǎn)推薦
主流的 MCU 開發(fā)語言為什么是 C 而不是 C++?
在單片機(jī)的地界兒里,C語言穩(wěn)坐中軍帳,C++想分杯羹?難嘍。咱電子工程師天天跟那針尖大的內(nèi)存空間較勁,C++那些花里胡哨的玩意兒,在這兒真玩不轉(zhuǎn)。先說內(nèi)存這道坎兒。您當(dāng)stm32f4的256kRAM

Spire.XLS for C++組件說明
Spire.XLS for C++ 是一款專業(yè)的 C++ Excel 組件,可以用在各種 C++ 框架和應(yīng)用程序中。Spire.XLS for C++ 提供了一個(gè)對(duì)象模型 Excel

AKI跨語言調(diào)用庫神助攻C/C++代碼遷移至HarmonyOS NEXT
/C++代碼快速遷移至HarmonyOS NEXT。憑借卓越的兼容性,AKI已成為廠商與開發(fā)者打造鴻蒙原生應(yīng)用過程中廣泛使用的跨語言調(diào)用解決方案。
AKI是一款專為鴻蒙原生開發(fā)設(shè)計(jì)的FFI(外部函數(shù)接口
發(fā)表于 01-02 17:08
同樣是函數(shù),在C和C++中有什么區(qū)別
同樣是函數(shù),在 C 和 C++ 中有什么區(qū)別? 第一個(gè)返回值。 C語言的函數(shù)可以不寫返回值類型,編譯器會(huì)默認(rèn)為返回 int。 但是 C++ 的函數(shù),除了構(gòu)造和析構(gòu)這兩個(gè)特殊的函數(shù),必須
C7000 C/C++優(yōu)化指南用戶手冊(cè)
電子發(fā)燒友網(wǎng)站提供《C7000 C/C++優(yōu)化指南用戶手冊(cè).pdf》資料免費(fèi)下載
發(fā)表于 11-09 15:00
?0次下載

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

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

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

TMS320C28x優(yōu)化C/C++編譯器v22.6.0.LTS
電子發(fā)燒友網(wǎng)站提供《TMS320C28x優(yōu)化C/C++編譯器v22.6.0.LTS.pdf》資料免費(fèi)下載
發(fā)表于 10-31 10:10
?0次下載

C7000優(yōu)化C/C++編譯器
電子發(fā)燒友網(wǎng)站提供《C7000優(yōu)化C/C++編譯器.pdf》資料免費(fèi)下載
發(fā)表于 10-30 09:45
?0次下載

基于OpenHarmony標(biāo)準(zhǔn)系統(tǒng)的C++公共基礎(chǔ)類庫案例:SafeMap
1、程序簡(jiǎn)介該程序是基于OpenHarmony的C++公共基礎(chǔ)類庫的安全關(guān)聯(lián)容器:SafeMap。OpenHarmony提供了一個(gè)線程安全的map實(shí)現(xiàn)。SafeMap在STLmap基礎(chǔ)上封裝互斥鎖

OpenVINO2024 C++推理使用技巧
很多人都使用OpenVINO新版的C++ 或者Python的SDK,都覺得非常好用,OpenVINO2022之后的版本C++ SDK做了大量的優(yōu)化與整理,已經(jīng)是非常貼近開發(fā)的使用習(xí)慣與推理方式。與OpenCV的Mat對(duì)象對(duì)接方式更是幾乎無縫對(duì)接,非常的方便好用。
C++語言基礎(chǔ)知識(shí)
電子發(fā)燒友網(wǎng)站提供《C++語言基礎(chǔ)知識(shí).pdf》資料免費(fèi)下載
發(fā)表于 07-19 10:58
?10次下載
C++中實(shí)現(xiàn)類似instanceof的方法
C++有多態(tài)與繼承,但是很多人開始學(xué)習(xí)C++,有時(shí)候會(huì)面臨一個(gè)常見問題,就是如何向下轉(zhuǎn)型,特別是不知道具體類型的時(shí)候,這個(gè)時(shí)候就希望C++ 可以向Java或者Python中有instanceof這個(gè)

評(píng)論