精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

高清欧美日韩| 97精品国产97久久久久久免费| 国产精品成人在线| 国产chinesehd精品露脸| 青青国产在线观看| 久久的色偷偷| 亚洲国产精品精华液2区45| 久久久久久久999| 老司机久久精品| 涩爱av在线播放一区二区| 国产精品一区二区三区四区在线观看 | 久久99精品久久久水蜜桃| 国产精品亚洲成人| 99国产精品免费视频观看| 亚洲精品久久久久久国产精华液| 91精品国产91久久久久久不卡| 亚洲色图欧美自拍| a中文在线播放| 99精品视频免费观看视频| 在线不卡欧美精品一区二区三区| 欧美黑人xxxxx| 国产一级视频在线播放| 高清不卡一区| 一本色道综合亚洲| 久久福利电影| 国产按摩一区二区三区| 国产韩日影视精品| 亚洲精品久久7777777| 波多野结衣综合网| 人妻丰满熟妇av无码区hd| 欧美日韩国产高清| 日韩欧美一二区| 中文字幕一区二区三区有限公司| 97超碰人人草| 久久久久久久久丰满| 9191精品国产综合久久久久久| 亚洲欧洲国产精品久久| 国产精品久久久久久久久久久久久久久久久久| 日韩系列欧美系列| 精品视频色一区| 中文字幕剧情在线观看一区| 日韩av成人| 成人午夜电影网站| 97视频免费看| 特级片在线观看| 第四色在线一区二区| 亚洲国产精品久久久久秋霞影院 | 日韩三级av在线| 国产福利资源一区| 91麻豆精品久久久久蜜臀| 爆乳熟妇一区二区三区霸乳| 中文字幕在线免费| 国产大片一区二区| 69视频在线播放| 国产在线一二区| 亚洲天堂偷拍| 一区二区欧美亚洲| 青娱乐国产精品视频| 丁香花在线影院| 97久久精品人人爽人人爽蜜臀| 欧美整片在线观看| 欧美特黄一级片| 色悠久久久久综合先锋影音下载 | 狠狠人妻久久久久久| 精品国产一区二区三区噜噜噜 | 岛国av在线不卡| 日韩成人av网站| 国产日产亚洲系列最新| 国产精品久久国产愉拍| 中文字幕亚洲自拍| 小毛片在线观看| 99久久精品一区二区成人| 在线观看视频欧美| 国产免费一区二区视频| 免费一级毛片在线观看| 久久99精品国产麻豆婷婷| 欧美日韩日本国产| 久久久无码精品亚洲日韩按摩| 亚洲精品www久久久| 国产69视频在线观看| 伊人久久综合一区二区| 亚洲欧美日韩电影| 蜜桃av久久久亚洲精品| aaa级黄色片| 成人妖精视频yjsp地址| 久久精品国产美女| melody高清在线观看| 日韩美女视频一区二区| 欧美污视频久久久| 国产成人天天5g影院在线观看| 成人免费av在线| 欧美国产二区| 黄色网在线免费观看| 国产日产欧美一区| 精品亚洲第一| 精品国产亚洲av麻豆| 六月丁香婷婷色狠狠久久| 91精品国产高清久久久久久| 欧美亚洲另类小说| 亚洲精选91| 久久99国产精品自在自在app | 亚洲综合小说图片| 日韩视频中午一区| 免费涩涩18网站入口| 小草在线视频免费播放| 亚洲一区在线视频| 奇米777四色影视在线看| 欧美日韩xx| 国产午夜精品美女毛片视频| 福利网在线观看| 中文字幕在线免费| 精品日本高清在线播放| 天天摸天天舔天天操| 粉嫩91精品久久久久久久99蜜桃| 制服丝袜激情欧洲亚洲| 色天使在线视频| 欧美精品中文| 精品视频久久久久久久| 中文字幕乱码一区| 欧美xxxxx视频| 神马国产精品影院av| 波多野结衣家庭教师在线观看| 红桃视频在线观看一区二区| 亚洲网在线观看| 国产黄片一区二区三区| 国产精品一区2区3区| 欧美肥臀大乳一区二区免费视频| 欧美精品成人久久| 一区在线免费观看| 国产91精品青草社区| 久久夜色精品亚洲| 国产成a人无v码亚洲福利| 国产精品一区二区在线观看| 亚洲精品久久久久avwww潮水| 成人午夜视频在线观看| 一区二区三区四区国产| 成人欧美在线| 亚洲h在线观看| 日韩 欧美 高清| 久久亚洲人体| 日韩欧美成人午夜| 夫妻性生活毛片| 伊人精品在线| 成人午夜电影免费在线观看| 亚洲 小说区 图片区 都市| 久久综合久久鬼色中文字| 日本在线播放一区| zzzwww在线看片免费| 色综合久久88色综合天天| 亚洲精品第二页| 亚洲激情av| 国产有色视频色综合| 成a人v在线播放| 在线观看视频一区二区欧美日韩| 久久久久亚洲av成人无码电影| 日韩午夜电影网| 国产精品一区二区三区毛片淫片| 国产喷水吹潮视频www| 国产精品每日更新在线播放网址| 国产传媒久久久| 久久久成人av毛片免费观看| 欧美电影精品一区二区| 特级片在线观看| www.亚洲精品| 色乱码一区二区三区熟女| 日韩美女在线| 亚洲成人网在线| 99久久久无码国产精品不卡| 在线不卡亚洲| 久久av一区二区| 国产一区二区主播在线| xxx成人少妇69| 奇米影视第四色777| 99久久久国产精品免费蜜臀| 毛片av免费在线观看| 成人动漫免费在线观看| 97激碰免费视频| 巨骚激情综合| 欧美精品一级二级三级| 久久老司机精品视频| 美女视频免费一区| 精品国产91亚洲一区二区三区www| 岛国在线视频网站| 国产性色av一区二区| 97精品人妻一区二区三区香蕉| 一区二区三区中文字幕电影| 免费a在线观看播放| 免费在线观看精品| 成人一区二区av| 亚洲资源网站| 成人黄色午夜影院| 免费在线观看一级毛片| 欧美军同video69gay| 日本少妇全体裸体洗澡| 国产乱一区二区| 亚洲色欲久久久综合网东京热| 亚洲男人都懂第一日本| 成人乱人伦精品视频在线观看| 波多一区二区| 上原亚衣av一区二区三区| 免费观看成年人视频| 欧美日韩一区二区在线观看视频 | 欧美日韩国产一中文字不卡| 一级免费黄色录像| 91社区在线播放| 成人免费观看cn| 欧美va久久久噜噜噜久久| 狠狠色狠狠色综合人人| 99视频这里有精品| www亚洲精品| 四虎影院在线播放| 欧美性xxxx18| 免费一级做a爰片久久毛片潮| 国产在线观看一区二区| 国产av第一区| 日韩成人精品| 国产精品嫩草影院久久久| jizz在线免费观看| 亚洲国产精品yw在线观看| 一级片一区二区三区| 一本大道久久a久久综合| 国产在线观看免费视频今夜| 中文字幕亚洲视频| 天天爽夜夜爽视频| 日本不卡一区二区三区高清视频| 日韩区国产区| 婷婷激情久久| 国产精品久久久久久五月尺| 国内激情视频在线观看| 欧美精品在线极品| 国内爆初菊对白视频| 天天射综合影视| 亚洲人成人无码网www国产 | 欧美日韩亚州综合| 波多野结衣黄色| 综合久久久久久| 国产午夜福利一区| 狠狠色丁香婷婷综合| 国产日韩亚洲欧美在线| 一区二区在线影院| 精品国产中文字幕| 精品人人人人| 国产精品草莓在线免费观看| 中老年在线免费视频| 97国产精品视频| 毛片电影在线| 日韩亚洲欧美中文高清在线| 国产原创av在线| 日韩一区二区麻豆国产| 国产伦理一区二区| 欧美一区二区成人6969| 少妇一级淫片免费放中国 | 日本丰满少妇做爰爽爽| 91久久线看在观草草青青| av资源在线免费观看| 欧美激情一区二区在线| 在线观看免费视频黄| 高清av一区二区| 国产chinese中国hdxxxx| 成人h动漫精品一区二区| 奇米影音第四色| 久久成人综合网| www.五月天色| 成人午夜精品一区二区三区| 网站免费在线观看| 国产一区视频导航| 欧美一级大片免费看| 北条麻妃国产九九精品视频| 99久久人妻无码中文字幕系列| 91香蕉视频mp4| 舐め犯し波多野结衣在线观看| 国产精品久久影院| 日韩一级片av| 欧美日韩亚洲精品内裤| 丰满人妻一区二区三区四区| 午夜精品久久久久久久久| 五月婷婷色丁香| 亚洲一区二区三区国产| www.av麻豆| 欧美性色黄大片手机版| www..com国产| 欧美视频一区二区三区四区| 国产模特av私拍大尺度| 亚洲国产精品va在看黑人| 成人高清免费在线播放| 久久久av网站| 免费在线观看黄| 久久久久久亚洲精品| 精品成人av| 欧洲中文字幕国产精品| 欧美特黄色片| 国产精品jizz视频| 欧美伦理在线视频| 免费视频爱爱太爽了| 麻豆精品久久精品色综合| 韩国三级hd两男一女| 中文成人av在线| 日韩伦理在线视频| 欧美日韩国产首页| 这里只有精品9| 欧美日韩午夜精品| 亚洲精品喷潮一区二区三区| 国产亚洲欧洲在线| 国产精品一品| 91精品国产综合久久久久久蜜臀| 欧美大片1688网站| 国产伦一区二区三区色一情| 日韩中文欧美| 99色精品视频| 久久资源在线| 免费看黄色一级大片| 日韩国产欧美在线观看| 精品日韩久久久| 99久久综合狠狠综合久久| 亚洲伦理一区二区三区| 色婷婷av久久久久久久| 日韩在线视频免费| 成人444kkkk在线观看| av在线app| 国产欧美日韩亚洲精品| 精品一区欧美| 亚洲欧美日本国产有色| 一本色道久久精品| 亚洲三级在线视频| 中文字幕一区不卡| 国产日韩久久久| 亚洲欧美精品中文字幕在线| 触手亚洲一区二区三区| 91av福利视频| 超碰成人福利| 欧美精品123| 99riav国产精品| 国产伦精品一区二区免费| 亚洲精品国产无天堂网2021| 91片黄在线观看喷潮| 中文字幕国产日韩| 韩日一区二区| 色一情一乱一伦一区二区三区| 水蜜桃精品av一区二区| 好男人www社区| 国产亚洲精品久| 青青国产在线视频| 国产一区二区三区18| 午夜日韩成人影院| 18成人在线| 亚洲a级精品| 免费在线观看亚洲视频| 免费精品99久久国产综合精品| 男女做爰猛烈刺激| 在线视频国内自拍亚洲视频| 九九九伊在人线综合| 国产第一区电影| 一级毛片精品毛片| 日韩高清在线播放| 日本午夜精品视频在线观看| 亚洲精品成人无码| 精品视频一区二区不卡| 久热国产在线| 91视频99| 99精品热视频只有精品10| 中文字幕一二三四区| 亚洲精品第1页| 精品国自产拍在线观看| 午夜精品一区二区三区av| 色爱综合av| 三级在线免费看| 亚洲天堂av一区| 精品视频一二三区| 色噜噜狠狠狠综合曰曰曰88av| 日本a人精品| 日本aa在线观看| 91色.com| 在线观看中文字幕2021| 欧美人与物videos| 亚洲日产av中文字幕| 午夜精品久久久久久久99热影院| 一区二区三区色| 亚洲欧洲精品视频| 国产一区二区色| 国产精品videossex久久发布| 黄色片视频免费观看| 欧美色电影在线| 精灵使的剑舞无删减版在线观看| 91精品国产综合久久久久久蜜臀 | 欧美激情精品久久久久久变态| 老牛影视av一区二区在线观看| 亚洲狼人综合干| 亚洲一区欧美一区| 国产在线一二| 7777精品伊久久久大香线蕉语言| 亚洲专区欧美专区| 中文成人无字幕乱码精品区| 欧美亚日韩国产aⅴ精品中极品| 成人看片免费| 欧美三日本三级少妇三99| 国产精品亚洲第一区在线暖暖韩国| 免费看污视频的网站| 欧美片一区二区三区| 精品大片一区二区| 国产女人18毛片水真多18|