亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C和C++混合編程問題

2020-05-23 14:13:47
字體:
來源:轉載
供稿:網友

這篇文章主要介紹了C和C++混合編程問題,需要的朋友可以參考下

分析以下一段代碼:

 

 
  1. /*=======sum.h=========*/ 
  2.  
  3. #ifndef SUM_H 
  4. #define SUM_H 
  5. #include <stdio.h> 
  6.  
  7. int sum(int a,int b); 
  8.  
  9.  
  10. #endif; 
  11.  
  12. /*=======sum.c=========*/ 
  13.  
  14. #include "sum.h" 
  15.  
  16.  
  17. int sum(int a,int b) 
  18. int c=a+b; 
  19. return c; 
  20.  
  21. /*====main.cpp======*/ 
  22.  
  23. #include "sum.h" 
  24.  
  25. void mian(){ 
  26.  
  27. cout << sum(1,2)<<endl; 
  28.  

調用以上三個文件,編譯通過,但是執行是出現以下問題:

obj : error LNK2001: 無法解析的外部符號 "int __cdecl sum(int,int)" (?sum@@YAHHH@Z)

E:/Programming/Grapic/test/Debug/test.exe : fatal error LNK1120: 1 個無法解析的外部命令

問題出在哪里呢? 在main.cpp里調用了sum.c,也就是說在C++程序里調用了C程序,此時如果沒有作相應處理將會出現鏈接錯誤。

extern "C"表示編譯生成的內部符號名使用C約定。C++支持函數重載,而C不支持,兩者的編譯規則也不一樣。函數被C++編譯后在符號庫中的名字與C語言的不同。例如,假設某個函數的原型為:void foo( int x, int y ); 該函數被C編譯器編譯后在符號庫中的名字可能為_foo,而C++編譯器則會產生像_foo_int_int之類的名字(不同的編譯器可能生成的名字不同,但是都采用了相同的機制,生成的新名字稱為“mangled name”)。_foo_int_int這樣的名字包含了函數名、函數參數數量及類型信息,C++就是靠這種機制來實現函數重載的。

那么如果在C中調用C++代碼,以及如何在C++中調用C的代碼呢?

extern "C"表示編譯生成的內部符號名使用C約定。

1. 如何在C++中調用C呢?

C++調用C,extern "C" 的作用是:讓C++連接器找調用函數的符號時采用C的方式

本文開頭提出的筆試題可以這樣修改:

 

 
  1. /*=======sum.h=========*/ 
  2.  
  3. #ifndef SUM_H 
  4. #define SUM_H 
  5. #include <stdio.h> 
  6.  
  7. int sum(int a,int b); 
  8.  
  9.  
  10. #endif; 
  11.  
  12. /*=======sum.c=========*/ 
  13.  
  14. #include "sum.h" 
  15.  
  16.  
  17. int sum(int a,int b) 
  18. int c=a+b; 
  19. return c; 
  20.  
  21. /*====main.cpp======*/ 
  22.  
  23. extern "C" 
  24. #include "sum.h" 
  25.  
  26. void mian(){ 
  27.  
  28. cout << sum(1,2)<<endl; 
  29.  

執行成功

相信到這里差不多明白了

2. 怎樣在C里調用C++呢?

在C中引用C++函數(C調用C++,使用extern "C"則是告訴編譯器把cpp文件中extern "C"定義的函數依照C的方式來編譯封裝接口,當然接口函數里面的C++語法還是按C++方式編譯)

執行:test1.obj : error LNK2019: 無法解析的外部符號 _sum,該符號在函數 _main 中被引用

E:/Programming/Grapic/test/Debug/test.exe : fatal error LNK1120: 1 個無法解析的外部命令

 

 
  1. /*=======sum.h=========*/ 
  2.  
  3. #ifndef SUM_H 
  4. #define SUM_H 
  5. #include <stdio.h> 
  6.  
  7. int sum(int a,int b); 
  8.  
  9.  
  10. #endif; 
  11.  
  12. /*=======sum.cpp=========*/ 
  13.  
  14. #include "sum.h" 
  15.  
  16.  
  17. extern "C" 
  18. int sum(int a,int b) 
  19. int c=a+b; 
  20. return c; 
  21.  
  22. /*====main.c======*/ 
  23.  
  24. #include "sum.h" 
  25.  
  26. void mian(){ 
  27.  
  28. cout << sum(1,2)<<endl; 
  29.  

3. 標準規范寫法

一般我們都將函數聲明放在頭文件,當我們的函數有可能被C或C++使用時,我們無法確定被誰調用,使得不能確定是否要將函數聲明在extern "C"里,所以,我們可以添加

 

 
  1. #ifdef __cplusplus 
  2.  
  3. extern "C" 
  4.  
  5.  
  6. #endif 
  7.  
  8. //函數聲明 
  9.  
  10. #ifdef __cplusplus 
  11.  
  12.  
  13. #endif 

利用以上聲明形式就可以綜合運用了。

在C中引用C++語言中的函數和變量時,C++的函數或變量要聲明在extern "C"{}里,但是在C語言中不能使用extern "C",否則編譯出錯。(出現錯誤: error C2059: syntax error : 'string',這個錯誤在網上找了很久,國內網站沒有搜到直接說明原因的,原因是extern "C"是C++中的關鍵詞,不是C的,所有會出錯。

 

 
  1. /*=======sum.h=========*/ 
  2.  
  3. #ifndef SUM_H 
  4. #define SUM_H 
  5. #include <stdio.h> 
  6.  
  7. int sum(int a,int b); 
  8.  
  9.  
  10. #endif; 
  11.  
  12. /*=======sum.cpp=========*/ 
  13.  
  14. #include "sum.h" 
  15.  
  16.  
  17. int sum(int a,int b) 
  18. int c=a+b; 
  19. return c; 
  20.  
  21. /*====main.c======*/ 
  22.  
  23. #include "sum.h" 
  24.  
  25. void mian(){ 
  26.  
  27. cout << sum(1,2)<<endl; 
  28.  

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
色99之美女主播在线视频| 91国内精品久久| 北条麻妃一区二区在线观看| 精品久久中文字幕久久av| 精品久久久久国产| 亚洲成人久久一区| 亚洲免费电影在线观看| 精品亚洲夜色av98在线观看| 88xx成人精品| 亚洲男人天天操| 北条麻妃久久精品| 91精品国产91久久久久福利| 日韩精品在线播放| 欧美日韩国产在线播放| 在线精品播放av| 成人国产精品日本在线| 永久免费毛片在线播放不卡| 91av视频在线播放| 美女啪啪无遮挡免费久久网站| 51色欧美片视频在线观看| 一区二区三区美女xx视频| 欧美国产一区二区三区| 91超碰caoporn97人人| 久久久亚洲网站| 91亚洲午夜在线| 欧美激情一区二区三区高清视频| 一区二区欧美亚洲| 中文字幕亚洲激情| 久久精品99无色码中文字幕| 国产一区二区黄| 色婷婷av一区二区三区在线观看| 欧美日本高清视频| 亚洲综合国产精品| 性欧美视频videos6一9| 亚州精品天堂中文字幕| 欧美激情影音先锋| 亚洲石原莉奈一区二区在线观看| 日本韩国欧美精品大片卡二| 91嫩草在线视频| 亚洲成人999| 91在线观看免费高清| xxx欧美精品| 国产精品av网站| 欧美日韩在线视频观看| 日韩中文视频免费在线观看| 久久99精品国产99久久6尤物| 92国产精品久久久久首页| 久久av资源网站| 欧美激情国产日韩精品一区18| 97av在线视频免费播放| 欧美性猛交xxxx乱大交极品| 亚洲精品国偷自产在线99热| 福利精品视频在线| 综合136福利视频在线| 中文字幕亚洲无线码在线一区| 国产欧美婷婷中文| 国产亚洲精品美女久久久| 日韩av在线一区| 欧美日韩国产在线看| 91在线高清免费观看| 国产91露脸中文字幕在线| 日本精品视频在线播放| 97欧美精品一区二区三区| 青青草精品毛片| 亚洲一区二区三区视频播放| 国自在线精品视频| 91免费欧美精品| 国产精品夫妻激情| 国产91精品高潮白浆喷水| 亚洲福利视频专区| 国产97在线观看| 亚洲乱亚洲乱妇无码| 欧美大片欧美激情性色a∨久久| 福利微拍一区二区| 蜜臀久久99精品久久久久久宅男| 欧美亚洲另类视频| 欧美激情视频在线免费观看 欧美视频免费一| 国产精品极品美女粉嫩高清在线| 亚洲最大福利网| 最新国产成人av网站网址麻豆| 欧美一级成年大片在线观看| 久久国产精品99国产精| 久久av.com| 日本久久久a级免费| 一本大道香蕉久在线播放29| 成人黄色在线播放| 国产精品成熟老女人| 国产精品中文字幕在线| 亚洲欧美日韩天堂一区二区| 91影视免费在线观看| 国产视频一区在线| 亚洲欧美日韩直播| 97香蕉久久超级碰碰高清版| 亚洲在线视频福利| 久久成人精品一区二区三区| 日韩av手机在线观看| 国产精品爱啪在线线免费观看| 久久人体大胆视频| 国产99久久久欧美黑人| 这里只有视频精品| 色偷偷av一区二区三区| 国产成人自拍视频在线观看| 亚洲欧美日韩国产中文专区| 亚洲xxxx做受欧美| 国产精品丝袜高跟| 日韩三级成人av网| 久久久久99精品久久久久| 91国产美女在线观看| 亚洲伊人久久综合| 日韩亚洲精品视频| 日韩美女福利视频| 国内成人精品视频| 欧美成人h版在线观看| **欧美日韩vr在线| 亚洲精品www久久久| 最近2019中文字幕第三页视频| 国产69精品久久久久99| 2019中文字幕在线观看| 久久久久在线观看| 国产免费亚洲高清| 亚洲欧美国产精品va在线观看| 国产亚洲精品91在线| 国产精品一区二区久久精品| 亚洲一区二区中文字幕| 日韩电影中文字幕一区| 成人在线国产精品| 欧美色欧美亚洲高清在线视频| 亚洲欧洲美洲在线综合| 国产福利视频一区| 在线日韩日本国产亚洲| 91在线免费网站| 国产日韩在线免费| 欧美黑人巨大xxx极品| 一本色道久久88综合亚洲精品ⅰ| 国产精品视频一区二区高潮| 亚洲精品电影网| 国产精品老女人视频| 91久久在线播放| 国产一区玩具在线观看| 国内外成人免费激情在线视频网站| 亚洲精品动漫100p| 亚洲区免费影片| 国语自产精品视频在线看一大j8| 久久精品国产综合| 亚洲一区美女视频在线观看免费| 欧美激情视频播放| 欧美在线激情网| 在线观看欧美成人| 国产精品成人久久久久| 中文字幕日韩专区| 国产精品欧美激情在线播放| 日韩精品久久久久久福利| 亚洲福利视频网站| 国模叶桐国产精品一区| 亚洲欧洲国产精品| 日韩美女毛茸茸| 国产精品久久久久秋霞鲁丝| 久久久99免费视频| 国产欧美一区二区三区四区| 国产成人+综合亚洲+天堂| 国产成人精品免费久久久久| 欧美激情手机在线视频| 福利二区91精品bt7086| 色哟哟入口国产精品|