欧美大屁股bbbbxxxx,狼人大香伊蕉国产www亚洲,男ji大巴进入女人的视频小说,男人把ji大巴放进女人免费视频,免费情侣作爱视频

歡迎來到入門教程網(wǎng)!

C語言

當前位置:主頁 > 軟件編程 > C語言 >

C和C++混合編程問題

來源:本站原創(chuàng)|時間:2020-01-10|欄目: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======*/

#include "sum.h"

void mian(){

cout << sum(1,2)<<endl;

}

調(diào)用以上三個文件,編譯通過,但是執(zhí)行是出現(xiàn)以下問題:

obj : error LNK2001: 無法解析的外部符號 "int __cdecl sum(int,int)" (?sum@@YAHHH@Z)
E:\Programming\Grapic\test\Debug\test.exe : fatal error LNK1120: 1 個無法解析的外部命令

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


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

那么如果在C中調(diào)用C++代碼,以及如何在C++中調(diào)用C的代碼呢?

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

1. 如何在C++中調(diào)用C呢?

C++調(diào)用C,extern "C" 的作用是:讓C++連接器找調(diào)用函數(shù)的符號時采用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;

}

執(zhí)行成功

相信到這里差不多明白了

2. 怎樣在C里調(diào)用C++呢?

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

執(zhí)行:test1.obj : error LNK2019: 無法解析的外部符號 _sum,該符號在函數(shù) _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. 標準規(guī)范寫法

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

#ifdef __cplusplus

extern "C"

{

#endif

//函數(shù)聲明

#ifdef __cplusplus

}

#endif

利用以上聲明形式就可以綜合運用了。
在C中引用C++語言中的函數(shù)和變量時,C++的函數(shù)或變量要聲明在extern "C"{}里,但是在C語言中不能使用extern "C",否則編譯出錯。(出現(xiàn)錯誤: error C2059: syntax error : 'string',這個錯誤在網(wǎng)上找了很久,國內(nèi)網(wǎng)站沒有搜到直接說明原因的,原因是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;

}

上一篇:C++實現(xiàn)對輸入數(shù)字組進行排序

欄    目:C語言

下一篇:搭建C語言開發(fā)環(huán)境(Windows平臺)匯總

本文標題:C和C++混合編程問題

本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/2670.html

網(wǎng)頁制作CMS教程網(wǎng)絡編程軟件編程腳本語言數(shù)據(jù)庫服務器

如果侵犯了您的權(quán)利,請與我們聯(lián)系,我們將在24小時內(nèi)進行處理、任何非本站因素導致的法律后果,本站均不負任何責任。

聯(lián)系QQ:835971066 | 郵箱:835971066#qq.com(#換成@)

Copyright © 2002-2020 腳本教程網(wǎng) 版權(quán)所有