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; }