程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C和C++混雜編程成績

C和C++混雜編程成績

編輯:關於C++

C和C++混雜編程成績。本站提示廣大學習愛好者:(C和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======*/

#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 __cplusplus

extern "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;

}
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved