精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

C++中是如何調用C接口的?

開發 后端
如何在C++代碼中調用寫好的C接口?你可能會奇怪,C++不是兼容C嗎?直接調用不就可以了?這里我們先按下不表,先看看C++如何調用C代碼接口。

[[335900]]

前言

如何在C++代碼中調用寫好的C接口?你可能會奇怪,C++不是兼容C嗎?直接調用不就可以了?這里我們先按下不表,先看看C++如何調用C代碼接口。

C++如何調用C接口

為什么會有這樣的情況呢?想象一下,有些接口是用C實現的,并提供了庫,那么C++中該如何使用呢?我們先不做任何區別對待,看看普通情況下會發生什么意想不到的事情。

首先提供一個C接口:

 

  1. //來源:公眾號【編程珠璣】 
  2. // 博客:https://www.yanbinghu.com 
  3. //test.c 
  4. #include"test.h" 
  5. void testCfun() 
  6.     printf("I am c fun\n"); 
  7.     return

為了簡化,我們在這里就不將它做成靜態庫或者動態庫了,有興趣的可以參考《靜態庫制作》自行嘗試。我們在這里編譯成C目標文件:

 

  1. gcc -c test.c 

另外提供一個頭文件test.h:

 

  1. #include<stdio.h> 
  2. void testCfun(); 

我們的C++代碼調用如下:

 

  1. //來源:公眾號【編程珠璣】 博客:https://www.yanbinghu.com 
  2. //main.cpp 
  3. #include"test.h" 
  4. #include<iostream> 
  5. using namespace std; 
  6. int main(void) 
  7.     /*調用C接口*/ 
  8.     cout<<"start to call c function"<<endl; 
  9.     testCfun(); 
  10.     cout<<"end to call c function"<<endl; 
  11.     return 0; 

編譯:

 

  1. $ g++ -o main main.cpp test.o 
  2. /tmp/ccmwVJqM.o: In function `main': 
  3. main.cpp:(.text+0x21): undefined reference to `testCfun()' 
  4. collect2: error: ld returned 1 exit status 

很不幸,最后的鏈接報錯了,說找不到testCfun,但是我們確實定義了這個函數。為什么會找不到呢?現在你還會認為C++直接就可以調用C接口了嗎?

真相

我們都知道,C++中函數支持重載,而C并不支持。C++為了支持函數重載,它在“生成”函數符號信息時,不能僅僅通過函數名,因為重載函數的函數名都是一樣的,所以它還要根據入參,命名空間等信息來確定唯一的函數簽名。或者說C++生成函數簽名的方式與C不一致,所以即便是函數名一樣,對于C和C++來說,它們最終的函數簽名還是不一樣。當然這里又是另外一回事了,我們不細說。我們看看兩個文件里的函數符號有什么區別:

 

  1. $ nm test.o|grep testCfun 
  2. 0000000000000000 T testCfun 
  3. $ nm main.o|grep testCfun 
  4.                 U _Z8testCfunv 

所以它們兩個能鏈接在一起才真是奇怪了呢!名字都不同,還怎么鏈接?

如何處理

那么如何處理呢?很顯然,我們必須告訴鏈接器,這是一個C接口,而不是C++接口,所以需要加入 extern C,我們修改test.h

 

  1. #include<stdio.h> 
  2. extern "C"
  3. void testCfun(); 

這里用extern "C"將testCfun接口包裹起來,告訴編譯器,這里的是C代碼哈,你要按C代碼的方式處理。再次編譯:

 

  1. $ g++ -o main main.cpp test.o 
  2. $ ./main 
  3. start to call c function 
  4. I am c fun 
  5. end to call c function 

看終端輸出,完美!

優化

雖然上面的C接口可以被C++正常調用了,但是如果這個C接口要被C代碼調用呢?增加main.c內容如下

 

  1. //main.c 
  2. #include"test.h" 
  3. int main(void) 
  4.     /*調用C接口*/ 
  5.     testCfun(); 
  6.     return 0; 

編譯:

 

  1. $ gcc -o main main.c test.c 
  2. In file included from main.c:2:0: 
  3. test.h:2:8: error: expected identifier or '(' before string constant 
  4.  extern "C"
  5.         ^ 
  6. In file included from test.c:2:0: 
  7. test.h:2:8: error: expected identifier or '(' before string constant 
  8.  extern "C"

不出意外,又報錯了,很顯然,C語言中并沒有extern "C"這樣的寫法,所以為了能使得test.c的代碼既能被C++調用,也能被C調用,需要改寫成下面這樣:

 

  1. #include<stdio.h> 
  2. #ifdef __cplusplus 
  3. extern "C"
  4. #endif 
  5.  
  6. void testCfun(); 
  7.  
  8. #ifdef __cplusplus 
  9. #endif 

這里通過__cplusplus宏來控制是否需要extern “C”,如果是C++編譯器,那么extern "C"部分就會被預處理進去,這樣test.c代碼就可以既用于C++,也可以用于C啦。

趕快去你的C項目代碼頭文件中看看,是不是也有這樣的代碼段呢?

問題

為什么我們在C++代碼中可以直接調用一些標準C庫函數呢?即使你在main函數中調用printf等函數,它也不會出現鏈接錯誤。因為庫函數已經有了類似的處理了。

如果你還是不確定,你可以先預處理:

 

  1. $ g++ -E main.i main.cpp 

去生成的main.i文件中找一找,是不是有extern "C"。

總結

C++支持重載,而C不支持,C++并不能直接調用C代碼寫好的接口,因此如果你的C代碼想要能夠被C調用,也想被C++調用,那么別忘了extern "C"。

那么問題來了,C又該如何調用C++的接口呢?

責任編輯:龐桂玉 來源: C語言與C++編程
相關推薦

2019-08-28 14:21:39

C++C接口代碼

2021-10-11 11:53:07

C++接口代碼

2010-01-28 13:35:41

調用C++函數

2010-01-20 09:54:27

C++數據類型

2025-05-20 10:00:00

C++命名空間別名代碼

2010-01-21 14:07:14

CC++聲明

2010-01-26 15:51:06

C++變量

2010-01-27 16:05:06

C++堆棧

2010-01-21 09:34:57

C++語法

2014-09-19 10:46:36

LuaCC++

2023-11-09 23:31:02

C++函數調用

2010-02-01 13:25:32

Python腳本

2010-01-28 14:33:58

C++Test工具

2011-05-18 17:15:45

2010-01-27 17:16:52

C++構造函數

2010-01-28 16:31:54

C++類型

2010-01-25 10:25:19

C++變量

2010-01-21 13:33:44

C++基類

2010-01-20 10:19:55

C++數組

2020-08-21 13:20:36

C++If ElseLinux
點贊
收藏

51CTO技術棧公眾號

亚洲男女在线观看| 中国 免费 av| 中文字幕第三页| 久久久久免费av| 亚洲国产欧美自拍| 中文字幕av专区| 欧美大胆的人体xxxx| 久久亚洲一级片| 91免费欧美精品| www.国产高清| 91精品电影| 亚洲免费一级电影| 自拍偷拍激情视频| 深夜视频一区二区| 亚洲大尺度视频在线观看| 日本福利一区二区三区| 欧美 日韩 综合| 久久国产日韩欧美精品| 911国产网站尤物在线观看| 懂色av蜜臀av粉嫩av永久| 丁香婷婷成人| 777a∨成人精品桃花网| 成熟了的熟妇毛茸茸| a级网站在线播放| 欧美韩国日本一区| 久久国产精品一区二区三区| 99在线无码精品入口| 日韩黄色免费网站| 国产91精品高潮白浆喷水| 日本天堂中文字幕| 久久网站免费观看| 国产香蕉精品视频一区二区三区| 亚洲精品鲁一鲁一区二区三区 | 免费在线观看一级毛片| 国产98色在线|日韩| 国产精品日韩在线播放| 久久青青草原亚洲av无码麻豆| 欧美精品导航| 欧美另类老女人| 一区二区三区影视| 日韩dvd碟片| 中文字幕日韩av综合精品| 人妻一区二区视频| 亚洲第一二三区| 日韩大陆欧美高清视频区| 中文在线观看免费视频| av在线亚洲色图| 欧美不卡123| 国产成人精品综合久久久久99 | 免费看的黄色欧美网站| 97高清免费视频| 国产午夜福利一区二区| 在线成人h网| 色综合五月天导航| 久久久久久久久精| 欧美三级在线| 久久久久久91| 日本学生初尝黑人巨免费视频| 韩国一区二区三区在线观看| 欧美激情综合色综合啪啪五月| 欧美极品视频在线观看| 国产综合精品一区| 97在线观看免费| 成年人视频在线免费看| 肉色丝袜一区二区| 国产精品入口福利| 国产精品一区二区av白丝下载| 国产综合久久久久影院| 亚洲xxx自由成熟| 欧美一区二区三区成人片在线| 99re这里只有精品首页| 热舞福利精品大尺度视频| av网站大全在线观看| 亚洲天堂成人网| 老子影院午夜伦不卡大全| 成人一级福利| 在线观看国产日韩| 特黄特黄一级片| 久久成人福利| 国产午夜精品一区二区三区 | 91九色精品| 久久久久久久久国产| 在线观看黄网站| 日韩av中文在线观看| 成人xxxx视频| 色婷婷中文字幕| 欧美韩国日本不卡| 97超碰在线视| 九九热线视频只有这里最精品| 欧美精品在线观看播放| 毛茸茸free性熟hd| 欧美日韩中文一区二区| 欧美第一淫aaasss性| 国产中文字幕视频| 国产一区视频在线看| 精品在线视频一区二区| 日本激情视频在线观看| 亚洲成人av中文| 日韩一区二区三区不卡视频| 91精品导航| 国产亚洲精品久久久| 九九热精彩视频| 日本怡春院一区二区| 成人黄动漫网站免费| 国产日本在线| 亚洲午夜久久久久久久久电影院 | 日韩精品中文字| 羞羞在线观看视频| 国产日韩欧美三级| 亚洲一区二区三区xxx视频| 五月婷婷狠狠干| 亚洲欧美乱综合| 亚洲性生活网站| 成人av婷婷| 久久精品国产成人| 无码人妻精品一区二区| 成人午夜免费av| 制服国产精品| 91伊人久久| 国产视频精品xxxx| 国产在线观看免费av| 久久91精品久久久久久秒播| 免费看成人片| jizzjizz中国精品麻豆| 3d动漫精品啪啪1区2区免费| 亚洲精品国产精品国自产网站| 亚洲深夜福利| 国产精品视频在线免费观看| 国产成人午夜| 欧美猛男超大videosgay| 白白色免费视频| 99视频在线精品国自产拍免费观看| 91在线精品播放| 中文字幕日本在线观看| 在线观看免费成人| 亚洲色成人网站www永久四虎| 国产精品亚洲综合久久| 精品午夜一区二区三区| 国产高潮在线| 亚洲高清久久网| 免费在线视频一区二区| 国产成人精品影视| 国产精品videossex国产高清| 国产精品一区二区三区av| 日韩中文字幕视频| 自拍偷拍校园春色| 国产欧美久久久精品影院| 手机看片福利日韩| 黑丝美女一区二区| 国产精品成人在线| yjizz视频网站在线播放| 色婷婷综合久久久久中文 | 欧美女优在线视频| 国产91精品黑色丝袜高跟鞋| 久久精品蜜桃| 欧美午夜片在线观看| 久久久久久成人网| 美女诱惑一区二区| 一级黄色免费在线观看| 精品国产一级| 久久久久久久久久久av| 少妇av在线播放| 欧美日韩在线视频首页| 亚洲区免费视频| 日本成人超碰在线观看| 亚洲图片都市激情| 日韩中文字幕在线一区| 久久久久亚洲精品| 你懂的在线看| 欧美日韩久久久久久| 曰本女人与公拘交酡| 成人av在线一区二区三区| 各处沟厕大尺度偷拍女厕嘘嘘| 国产99亚洲| 91精品久久久久久久久| 欧美日韩经典丝袜| 亚洲精品一区二区网址| 国产尤物在线观看| 性做久久久久久免费观看欧美| 女人被狂躁c到高潮| 奇米四色…亚洲| 狠狠噜天天噜日日噜| 久久99视频| 亚洲一区久久久| 中文字幕乱码中文乱码51精品| 中文字幕在线看视频国产欧美在线看完整 | 国产精品久久电影观看| 乱人伦中文视频在线| 精品福利在线导航| 做爰视频毛片视频| 亚洲午夜电影网| 亚洲黄色免费视频| 国产91色综合久久免费分享| 农村妇女精品一二区| 亚洲影视一区| 欧美日韩最好看的视频| 国产一区二区三区视频在线| 日本成人黄色片| 18+视频在线观看| 亚洲香蕉成人av网站在线观看| 国产视频一二三四区| 欧美三级欧美成人高清www| 性欧美疯狂猛交69hd| 久久久久国产精品人| 免费黄色在线播放| 免费成人在线观看| av之家在线观看| 真实国产乱子伦精品一区二区三区| 免费看污久久久| 国产伦精品一区二区三区在线播放| 国产精品日韩专区| 偷拍自拍在线看| 久久免费在线观看| 岛国成人毛片| 日韩在线观看网址| 精品乱码一区二区三四区视频 | 老女人性生活视频| 青青草原综合久久大伊人精品优势| 麻豆tv在线播放| 欧美午夜影院| 日本福利视频导航| 欧美午夜精品一区二区三区电影| 黄色99视频| 91成人午夜| 亚洲专区在线视频| 欧美亚洲人成在线| 国产精品欧美久久久| 九九热线视频只有这里最精品| 欧美一级视频一区二区| 99热99re6国产在线播放| 日韩在线视频观看| 99精品老司机免费视频| 亚洲一区二区国产| 亚洲日本中文字幕在线| 日韩电视剧免费观看网站| 理论片中文字幕| 欧美mv日韩mv亚洲| 国产suv一区二区| 91精品在线一区二区| 国产精品无码天天爽视频| 欧美老女人第四色| 91亚洲国产成人精品一区| 欧美视频精品在线| 中文字幕在线网站| 欧美日韩一级黄| 一本色道久久综合熟妇| 欧美久久久久免费| 91国产精品一区| 欧美一区二区视频观看视频 | 成人自拍视频网| 国产精品九九九| 人人精品久久| 亚洲a级在线观看| 日韩一区二区三区色| 国产精品日韩欧美一区二区三区| 一区二区三区在线免费看| 91久久精品www人人做人人爽| 18国产精品| 国产精品三区在线| 婷婷精品在线| 日韩欧美一区二区视频在线播放| 成人一二三区| 黄色a级在线观看| 国产精品v亚洲精品v日韩精品| 日韩成人三级视频| 午夜在线视频观看日韩17c| 国产日韩一区二区在线观看| 久热精品在线| 无尽裸体动漫2d在线观看| 国产精品99久久久久久久vr| 国产a级片视频| 久久人人97超碰com| 手机免费观看av| 亚洲永久精品大片| 日韩黄色精品视频| 在线看日韩精品电影| 国产又粗又黄又爽视频| 亚洲аv电影天堂网| 男人的天堂在线| 久久成人精品视频| 天堂av在线网| 成人妇女淫片aaaa视频| 久久动漫网址| 伊人久久av导航| 亚洲欧洲日本一区二区三区| www.99在线| 成人美女视频在线观看| 91在线无精精品白丝| 亚洲免费观看高清完整版在线观看熊| 国产成人无码精品亚洲| 欧美色综合天天久久综合精品| 午夜精品小视频| 国产一区二区动漫| 男女免费观看在线爽爽爽视频| 热99精品里视频精品| 一区二区三区四区高清视频| 色噜噜色狠狠狠狠狠综合色一 | 黄色成人免费看| 成人小视频免费观看| 亚洲一二三精品| 天天影视色香欲综合网老头| 亚洲无码久久久久久久| 日韩av中文字幕在线免费观看 | 欧美人妖在线| 男人的天堂avav| 蜜桃av噜噜一区二区三区小说| avtt香蕉久久| 亚洲综合丝袜美腿| 一级黄色a视频| 亚洲精品一区二三区不卡| 男女在线视频| 91视频免费在线| 日本大胆欧美| 成人三级视频在线播放| 成人精品国产福利| 99精品久久久久| 欧美日韩一区二区三区在线| 免费在线性爱视频| 91国内在线视频| 荡女精品导航| 人妻无码一区二区三区四区| 久久99精品国产麻豆不卡| 亚洲精品午夜视频| 日韩欧美在线视频日韩欧美在线视频| 亚洲男人天堂久久| 欧美猛交ⅹxxx乱大交视频| 黄页免费欧美| 色中色综合成人| 日本特黄久久久高潮| 精品人妻中文无码av在线| 欧美性猛交xxxx久久久| 日韩在线观看视频一区| 欧美国产精品日韩| 日韩精品中文字幕一区二区 | 一色道久久88加勒比一| 欧美日韩国内自拍| 亚洲欧美自偷自拍| 97在线看福利| 一区三区在线欧| 黄色片久久久久| 91丨九色丨蝌蚪丨老版| 69视频免费在线观看| 日韩黄色高清视频| 深夜在线视频| 欧美一级爽aaaaa大片| 肉色丝袜一区二区| 三区四区在线观看| 欧美视频在线观看一区二区| 91在线网址| 91久久精品美女高潮| 久久久9色精品国产一区二区三区| 99精品视频国产| 亚洲精品成人精品456| 亚洲美女福利视频| 97免费中文视频在线观看| 亚洲精品合集| 麻豆一区二区三区视频| 中文字幕制服丝袜一区二区三区| 夜夜嗨av禁果av粉嫩avhd| 欧美精品一二区| 1204国产成人精品视频| 青青草原av在线播放| 国产欧美一区二区精品秋霞影院| 在线亚洲欧美日韩| 蜜臀久久99精品久久久无需会员| eeuss鲁片一区二区三区| 北条麻妃69av| 国产精品嫩草99a| www.av在线.com| 97激碰免费视频| 日本午夜一区| 波多野结衣三级视频| 欧美日韩亚洲高清| 97电影在线观看| 国产经典一区二区三区| 久久精品道一区二区三区| 波多野结衣喷潮| 精品欧美乱码久久久久久 | 色欲综合视频天天天| 男人天堂久久久| 国产日本一区二区三区| 日韩精品乱码免费| 九九视频在线观看| 亚洲午夜小视频| 一区二区视频| 99热手机在线| 婷婷久久综合九色综合伊人色| 超碰国产在线| 国产乱子伦精品| 精品写真视频在线观看| 日韩黄色三级视频| 久热精品视频在线| 亚洲黄页在线观看| 中文字幕久久久久久久| 欧美性猛片xxxx免费看久爱| 日本在线观看高清完整版| 亚洲欧美国产不卡| www.66久久| av中文字幕免费| 国产精品久久久久av免费|