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

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

C和C++混合編程問題

2020-01-26 14:50:26
字體:
來源:轉載
供稿:網友

分析以下一段代碼:

/*=======sum.h=========*/#ifndef SUM_H#define SUM_H#include <stdio.h>int sum(int a,int b);#endif;/*=======sum.c=========*/#include "sum.h"int sum(int a,int b){int c=a+b;return c;}/*====main.cpp======*/#include "sum.h"void mian(){cout << sum(1,2)<<endl;}

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

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的方式

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

/*=======sum.h=========*/#ifndef SUM_H#define SUM_H#include <stdio.h>int sum(int a,int b);#endif;/*=======sum.c=========*/#include "sum.h"int sum(int a,int b){int c=a+b;return c;}/*====main.cpp======*/extern "C"{#include "sum.h"}void mian(){cout << sum(1,2)<<endl;}

執行成功

相信到這里差不多明白了

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 個無法解析的外部命令

/*=======sum.h=========*/#ifndef SUM_H#define SUM_H#include <stdio.h>int sum(int a,int b);#endif;/*=======sum.cpp=========*/#include "sum.h"extern "C"{int sum(int a,int b){int c=a+b;return c;}}/*====main.c======*/#include "sum.h"void mian(){cout << sum(1,2)<<endl;}

3. 標準規范寫法

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

#ifdef __cplusplusextern "C"{#endif//函數聲明#ifdef __cplusplus}#endif

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

/*=======sum.h=========*/#ifndef SUM_H#define SUM_H#include <stdio.h>int sum(int a,int b);#endif;/*=======sum.cpp=========*/#include "sum.h"int sum(int a,int b){int c=a+b;return c;}/*====main.c======*/#include "sum.h"void mian(){cout << sum(1,2)<<endl;}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91亚洲精品一区二区| 国产精品久久久久久久美男| 久久久电影免费观看完整版| 精品露脸国产偷人在视频| 欧美成人精品三级在线观看| 国产一区二区av| 欧美精品精品精品精品免费| 亚洲视频一区二区| 久久综合久久美利坚合众国| 日本高清久久天堂| 亚洲自拍偷拍色片视频| 久久久久久久久综合| 亚洲视频999| 欧美成人免费网| 国产美女91呻吟求| 亚洲精品一区二区网址| 宅男66日本亚洲欧美视频| 欧美性xxxx极品hd满灌| 亚洲韩国欧洲国产日产av| 精品中文字幕在线2019| 日韩中文字幕在线视频| 一区二区三区四区在线观看视频| 亚洲男人天堂网站| 97免费在线视频| 国产亚洲精品美女久久久久| 欧美日韩亚洲系列| 国产精品一二三视频| 日韩一区二区欧美| 亚洲精品电影在线观看| 日本亚洲欧洲色α| 欧美一区二区三区精品电影| 国产精品视频免费在线观看| 69av成年福利视频| 精品久久久精品| 欧美日韩国产999| 久久99精品久久久久久琪琪| 亚洲视频在线观看| 日韩精品一区二区三区第95| 日韩av快播网址| 国产日产欧美a一级在线| 久久久久久国产精品美女| 欧美在线性视频| 色狠狠久久aa北条麻妃| 九九久久精品一区| 亚洲欧美日韩中文视频| 日韩黄色高清视频| 亚洲男人天堂手机在线| 国产日韩欧美在线看| 欧美激情精品久久久久| 亚洲一区二区中文| 成人精品一区二区三区电影黑人| 亚洲福利视频专区| 国产成人精品a视频一区www| 国产精品自产拍高潮在线观看| 久久视频在线免费观看| 国产精品69久久久久| 日韩中文综合网| 久久综合色影院| 国产精选久久久久久| 精品美女永久免费视频| 成人免费视频网| 日本久久久久久久久| 欧美午夜影院在线视频| 午夜精品久久久久久99热软件| 亚洲tv在线观看| 国产精品中文字幕在线观看| 久久久久久久久久久91| 日韩成人在线播放| 91亚洲va在线va天堂va国| 精品成人国产在线观看男人呻吟| 色老头一区二区三区在线观看| 国产一区二区三区日韩欧美| 欧美性生交大片免网| 国产精品香蕉在线观看| 亚洲色图35p| 久久免费成人精品视频| 亚洲欧洲在线观看| 欧美日韩在线免费| 成人午夜高潮视频| 狠狠操狠狠色综合网| 不卡在线观看电视剧完整版| 成人精品久久av网站| 亚洲精品福利在线| 亚洲精品福利免费在线观看| 久久视频在线视频| 国产精品678| 亚洲国产精品va在线观看黑人| 成人免费看片视频| 成人免费大片黄在线播放| www.久久久久久.com| 6080yy精品一区二区三区| 亚洲变态欧美另类捆绑| 中文字幕一区电影| 日韩欧美大尺度| 日韩高清电影好看的电视剧电影| 日韩精品在线影院| 国产成人精品一区二区三区| 日韩高清免费在线| 日韩精品免费在线播放| 国产精品久久久久久久久久东京| 91深夜福利视频| 欧美成人中文字幕在线| 国产亚洲日本欧美韩国| 久久久亚洲影院你懂的| 在线播放亚洲激情| 97视频在线观看免费高清完整版在线观看| 国产精品wwwwww| 欧美精品一区在线播放| 国产精品狼人色视频一区| www.国产精品一二区| 欧美成人免费视频| 欧美一级视频免费在线观看| 亚洲精品久久久久中文字幕欢迎你| 精品高清美女精品国产区| 欧美电影免费观看高清完整| 亚洲精品一区二区网址| 成人精品视频99在线观看免费| 亚洲黄色www网站| 97婷婷涩涩精品一区| 国产精品入口日韩视频大尺度| 欧美一级在线亚洲天堂| 国产噜噜噜噜噜久久久久久久久| 久久久国产精品一区| 亚洲天堂网在线观看| 色噜噜亚洲精品中文字幕| 精品国产自在精品国产浪潮| 欧美色道久久88综合亚洲精品| 69久久夜色精品国产69| 亚洲欧洲偷拍精品| 中文.日本.精品| 国产精品∨欧美精品v日韩精品| 欧美裸体视频网站| 国产欧美日韩91| 亚洲国产精品va在线| 色噜噜狠狠狠综合曰曰曰88av| 日韩电影视频免费| 日韩亚洲国产中文字幕| 日韩的一区二区| 国产91成人video| 国产精品久久久一区| 国产91av在线| 全亚洲最色的网站在线观看| 亚洲自拍中文字幕| 91精品久久久久久久久久久久久久| 亚洲人成在线电影| 亚洲www视频| 成人黄色免费在线观看| 国产成人在线一区二区| 欧美最近摘花xxxx摘花| 亚洲欧洲日韩国产| www.日韩.com| 国产成人综合精品在线| 欧美在线视频免费观看| 91夜夜揉人人捏人人添红杏| 欧美日韩国产中字| 久久天天躁狠狠躁夜夜爽蜜月| 久久久精品在线| 亚洲国产高潮在线观看| 亚洲欧洲美洲在线综合| 国产精品久久91| 一区二区三区视频免费在线观看| 欧美另类精品xxxx孕妇| 亚洲视频在线播放| 久久人人97超碰精品888|