日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

调用其他文件的define_C与C++的互相调用!就像大学宿舍一样,我用你的,你用我的!...

發(fā)布時(shí)間:2024/10/8 c/c++ 59 豆豆
生活随笔 收集整理的這篇文章主要介紹了 调用其他文件的define_C与C++的互相调用!就像大学宿舍一样,我用你的,你用我的!... 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

注意,本文的前提是,c代碼采用gcc等c語(yǔ)言編譯器編譯c代碼,采用g++等c++編譯器編譯c++代碼,如果c和c++代碼統(tǒng)一使用g++編譯,大部分情況是可以實(shí)現(xiàn)兩者代碼相互調(diào)用的。

以下為踩坑過(guò)程的總結(jié)o_O||。

C 與 C++ 的函數(shù)區(qū)別

要了解兩者之間如何實(shí)現(xiàn)相互調(diào)用,必須先了解c與c++之間的函數(shù)有什么不同。

c++作為c語(yǔ)言的升級(jí)版,兩者必然有很多不同之處。

其中有一個(gè)重大不同點(diǎn)就是,c++支持函數(shù)重載,而c語(yǔ)言不支持。為了使函數(shù)支持重載,c++在c語(yǔ)言的基礎(chǔ)上,將函數(shù)名添加上返回值和參數(shù)的類型信息。

例如,int add(int, int)這個(gè)函數(shù),通過(guò)c++編譯器編譯后,可能呈現(xiàn)的函數(shù)名為int int_add_int_int(int, int)
(注:此處為大概地說(shuō)明c++是如何將返回值和參數(shù)信息添加到函數(shù)名中的,實(shí)際中編譯器不一定是這樣實(shí)現(xiàn)的)。

從以上說(shuō)明可以得出,由于c++對(duì)函數(shù)重載的支持,使得編譯后的函數(shù)符號(hào)與c語(yǔ)言的不一致,即使是在兩者函數(shù)名相同的前提下。

extern "C"的作用

那么,c與c++是不能相互調(diào)用了嗎?答案是否定的,因?yàn)榇嬖谥鴈xtern "C"這個(gè)關(guān)鍵字可以使語(yǔ)句可以按照類C的編譯和連接規(guī)約來(lái)編譯和連接,而不是C++的編譯的連接規(guī)約。這樣在類C的代碼中就可以調(diào)用C++的函數(shù)or變量等。

注意:extern "C"指令中的"C",表示的一種編譯和連接規(guī)約,而不是一種語(yǔ)言。"C"表示符合C語(yǔ)言的編譯和連接規(guī)約的任何語(yǔ)言,如Fortran、assembler等。

還有要說(shuō)明的是,extern "C"指令僅指定編譯和連接規(guī)約,但不影響語(yǔ)義。例如在函數(shù)聲明中,指定了extern "C",仍然要遵守C++的類型檢測(cè)、參數(shù)轉(zhuǎn)換規(guī)則。

C++ 中調(diào)用 C 代碼

對(duì)于c++,由于c++的編譯器對(duì)c語(yǔ)言兼容,因此在c++中調(diào)用c語(yǔ)言編寫的函數(shù),只需要在函數(shù)聲明前面加上關(guān)鍵字extern "C",表示采用類c語(yǔ)言的方式解析函數(shù)符號(hào)。例子如下:

// add.h

在例子中,http://main.cc為c++代碼,add.c為c語(yǔ)言代碼,當(dāng)c++編譯器識(shí)別到extern "C"`關(guān)鍵字時(shí),會(huì)去尋找add函數(shù)的實(shí)現(xiàn)而不是尋找類似int_add_int_int這樣帶參數(shù)信息的函數(shù)實(shí)現(xiàn)。

C 語(yǔ)言調(diào)用 C++ 代碼

c語(yǔ)言調(diào)用c++代碼卻并不容易,原因是c語(yǔ)言并不兼容c++。

就算c語(yǔ)言可以調(diào)用c++,也會(huì)因?yàn)闊o(wú)法識(shí)別c++新定義的符號(hào)而編譯報(bào)錯(cuò)。

因此,為了實(shí)現(xiàn)c語(yǔ)言調(diào)用c++函數(shù),必須實(shí)現(xiàn)以下兩個(gè)步驟:

1. 將c++相關(guān)函數(shù)封裝為靜態(tài)庫(kù)或動(dòng)態(tài)庫(kù)(因?yàn)檎{(diào)用庫(kù)函數(shù)時(shí)編譯器并不知道里面執(zhí)行的是什么語(yǔ)言);

2. 對(duì)外提供遵循類c語(yǔ)言規(guī)約的接口函數(shù)。

例子如下所示:

// printNum.h

通過(guò)將cout函數(shù)封裝為類c語(yǔ)言規(guī)約的接口函數(shù),使得main.c中可以成功調(diào)用c++函數(shù)printNum。

值得注意的是,main.c不可以直接引入printNum.h,因?yàn)閏語(yǔ)言不能識(shí)別extern "C"關(guān)鍵字??梢岳胏++預(yù)定義宏實(shí)現(xiàn)頭文件的改寫:

#ifdef __PRINTNUM_H__

小結(jié)

? c語(yǔ)言與c++的相互調(diào)用可以通過(guò) extern "C" 關(guān)鍵字實(shí)現(xiàn)

? c++中調(diào)用c代碼,只須在c++中為c代碼函數(shù)聲明之前加上extern "C"

? c語(yǔ)言調(diào)用c++代碼,則需要將c++代碼編譯成靜態(tài)庫(kù)或動(dòng)態(tài)庫(kù),然后對(duì)外提供用 extern "C" 聲明的類c封裝函數(shù)

不管你是轉(zhuǎn)行也好,初學(xué)也罷,進(jìn)階也可——【值得關(guān)注進(jìn)入】小編的C/C++編程學(xué)習(xí)進(jìn)階專欄 :

C/C++編程學(xué)習(xí)殿堂?www.zhihu.com

涉及到:C語(yǔ)言、C++、windows編程、網(wǎng)絡(luò)編程、QT界面開發(fā)、Linux編程、游戲編程、黑客等等......

總結(jié)

以上是生活随笔為你收集整理的调用其他文件的define_C与C++的互相调用!就像大学宿舍一样,我用你的,你用我的!...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。