国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > 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;}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 台南市| 荔波县| 介休市| 黔江区| 泽库县| 会昌县| 石嘴山市| 佛学| 五大连池市| 通道| 和林格尔县| 扶绥县| 德兴市| 沙田区| 文成县| 博爱县| 连江县| 温泉县| 汉中市| 黄石市| 达拉特旗| 贡山| 读书| 开江县| 密云县| 马关县| 巴林左旗| 郁南县| 通渭县| 文登市| 丹凤县| 巴东县| 龙州县| 苍南县| 宣汉县| 河津市| 青阳县| 阳朔县| 分宜县| 分宜县| 拉孜县|