最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

c與c++之間的相互調(diào)用及函數(shù)區(qū)別示例詳解

 更新時(shí)間:2023年06月13日 09:27:18   作者:p了個(gè)c  
這篇文章主要為大家介紹了c與c++相互調(diào)用的使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

引言

最近項(xiàng)目需要使用google test(以下簡(jiǎn)稱為gtest)作為單元測(cè)試框架,但是項(xiàng)目本身過(guò)于龐大,main函數(shù)無(wú)從找起,需要將gtest框架編譯成靜態(tài)庫(kù)使用。因?yàn)轫?xiàng)目本身是通過(guò)純c語(yǔ)言編寫,而gtest則是一個(gè)c++編寫的測(cè)試框架,其中必然涉及c與c++之間的相互調(diào)用。

注意,本文的前提是,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)榇嬖谥?code>extern "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
#ifdef __ADD_H__
#define __ADD_H__
extern "C" int add(int a, int b);
#endif
// add.c
int add(int a, int b)
{
    return a + b;
}
// main.cc
#include <iostream>
#include "add.h"
using namespace std;
int main()
{
    cout << "1 + 1 = " << add(1, 1) << endl;
}

在例子中,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
#ifdef __PRINTNUM_H__
#define __PRINTNUM_H__
extern "C" void printNum(int a);
#endif
// printNum.cc
#include <iostream>
#include "printNum.h"
using namespace std;
void printNum(int a)
{
    cout << << "num is " << a << endl;
}
// main.c
extern void printNum(int a);
printNum(5);

通過(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)鍵字。可以利用c++預(yù)定義宏實(shí)現(xiàn)頭文件的改寫:

#ifdef __PRINTNUM_H__
#define __PRINTNUM_H__
#ifdef __cplusplus
extern "C" { 
#endif
void printNum(int a);
#ifdef __cplusplus
}
#endif
#endif

小結(jié)

小結(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ù)

以上就是c與c++之間的相互調(diào)用及函數(shù)區(qū)別示例詳解的詳細(xì)內(nèi)容,更多關(guān)于c c++相互調(diào)用的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 使用?C++20?Modules?導(dǎo)入?Boost?模塊的方法(問題記錄)

    使用?C++20?Modules?導(dǎo)入?Boost?模塊的方法(問題記錄)

    C++20?引入的?Modules?特性為?C++?開發(fā)帶來(lái)了諸多好處,如加快編譯速度、減少頭文件重復(fù)包含等問題,本文將詳細(xì)介紹如何使用?C++20?Modules?導(dǎo)入這些?Boost?模塊,感興趣的朋友一起看看吧
    2025-02-02
  • Qt實(shí)現(xiàn)帶字?jǐn)?shù)限制的文字輸入框

    Qt實(shí)現(xiàn)帶字?jǐn)?shù)限制的文字輸入框

    這篇文章介紹了Qt實(shí)現(xiàn)帶字?jǐn)?shù)限制文字輸入框的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • C++學(xué)習(xí)之cstdbool和cstddef頭文件封裝源碼分析

    C++學(xué)習(xí)之cstdbool和cstddef頭文件封裝源碼分析

    這篇文章主要為大家介紹了C++學(xué)習(xí)之cstdbool和cstddef頭文件封裝源碼分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • C++基于LINUX的文件操作

    C++基于LINUX的文件操作

    這篇文章主要為大家介紹了C++基于LINUX的文件操作示例知識(shí)擴(kuò)充,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • C語(yǔ)言memcpy函數(shù)用法詳解:高效內(nèi)存復(fù)制的實(shí)用工具

    C語(yǔ)言memcpy函數(shù)用法詳解:高效內(nèi)存復(fù)制的實(shí)用工具

    memcpy函數(shù)是C語(yǔ)言中高效復(fù)制內(nèi)存的首選工具,廣泛應(yīng)用于數(shù)組、結(jié)構(gòu)體和動(dòng)態(tài)內(nèi)存操作,本文將詳細(xì)講解memcpy函數(shù)的定義、用法、返回值、注意事項(xiàng)以及實(shí)際應(yīng)用場(chǎng)景,帶你全面掌握這一內(nèi)存操作利器,感興趣的朋友跟隨小編一起看看吧
    2025-10-10
  • C++將音頻PCM數(shù)據(jù)封裝成wav文件的方法

    C++將音頻PCM數(shù)據(jù)封裝成wav文件的方法

    這篇文章主要為大家詳細(xì)介紹了C++將音頻PCM數(shù)據(jù)封裝成wav文件的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • VC自定義消息響應(yīng)函數(shù)postmessage用法示例

    VC自定義消息響應(yīng)函數(shù)postmessage用法示例

    這篇文章主要介紹了VC自定義消息響應(yīng)函數(shù)postmessage用法示例,并對(duì)比說(shuō)明了postmessage與sendmessage的用法區(qū)別,需要的朋友可以參考下
    2014-10-10
  • C++實(shí)現(xiàn)簡(jiǎn)單通訊錄系統(tǒng)

    C++實(shí)現(xiàn)簡(jiǎn)單通訊錄系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)簡(jiǎn)單通訊錄系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • C++實(shí)現(xiàn)String與UF8互轉(zhuǎn)

    C++實(shí)現(xiàn)String與UF8互轉(zhuǎn)

    這篇文章介紹了C++實(shí)現(xiàn)String與UF8互轉(zhuǎn)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-05-05
  • 詳解C++編程中類的聲明和對(duì)象成員的引用

    詳解C++編程中類的聲明和對(duì)象成員的引用

    這篇文章主要介紹了詳解C++編程中類的聲明和對(duì)象成員的引用,是C++入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-09-09

最新評(píng)論

峨山| 舞钢市| 土默特右旗| 阜阳市| 灌南县| 曲水县| 黔东| 台中市| 喀什市| 卢湾区| 鹤峰县| 密山市| 库伦旗| 株洲市| 通州区| 土默特左旗| 凭祥市| 察哈| 北海市| 桐庐县| 清新县| 弥勒县| 阳东县| 秭归县| 余庆县| 民丰县| 盐津县| 巴塘县| 班玛县| 囊谦县| 都昌县| 平度市| 英超| 乐清市| 宕昌县| 缙云县| 吴堡县| 玛纳斯县| 大关县| 高雄县| 壶关县|