c與c函數(shù)的頭文件兼容宏定義

c與c函數(shù)的頭文件兼容宏定義

ID:8807646

大?。?7.50 KB

頁數(shù):6頁

時間:2018-04-08

c與c函數(shù)的頭文件兼容宏定義_第1頁
c與c函數(shù)的頭文件兼容宏定義_第2頁
c與c函數(shù)的頭文件兼容宏定義_第3頁
c與c函數(shù)的頭文件兼容宏定義_第4頁
c與c函數(shù)的頭文件兼容宏定義_第5頁
資源描述:

《c與c函數(shù)的頭文件兼容宏定義》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在應(yīng)用文檔-天天文庫。

1、關(guān)于“#ifdef__cplusplus”和"extern"C""看一些程序的時候老是有“#ifdef__cplusplusextern"C"{#endif”的定義,搞搞清楚是怎么回事:Microsoft-SpecificPredefinedMacros__cplusplusDefinedforC++programsonly.意思是說,如果是C++程序,就使用extern"C"{而這個東東,是指在下面的函數(shù)不使用的C++的名字修飾,而是用C的ThefollowingcodeshowsaheaderfilewhichcanbeusedbyCan

2、dC++clientapplications://MyCFuncs.h#ifdef__cplusplusextern"C"{//onlyneedtoexportCinterfaceif//usedbyC++sourcecode#endif__declspec(dllimport)voidMyCFunc();__declspec(dllimport)voidAnotherCFunc();#ifdef__cplusplus}#endif當(dāng)我們想從C++中調(diào)用C的庫時,(注,驅(qū)動是用C寫的,連new、delete也不能用,郁悶)不能僅僅說明一個外部

3、函數(shù),因為調(diào)用C函數(shù)的編譯代碼和調(diào)用C++函數(shù)的編譯代碼是不同的。如果你僅說明一個外部函數(shù),C++編譯器假定它是C++的函數(shù)編譯成功了,但當(dāng)你連接時會發(fā)現(xiàn)很可愛的錯誤。解決的方法就是指定它為C函數(shù):extern"c"函數(shù)描述指定一群函數(shù)的話:extern"C"{n個函數(shù)描述}如果想C和C++混用的話:#ifdef_cplusplusextern"C"{#endifn個函數(shù)描述#ifdef_cplusplus}#endifextern"C"表示編譯生成的內(nèi)部符號名使用C約定。???C++支持函數(shù)重載,而C不支持,兩者的編譯規(guī)則也不一樣。函數(shù)被C

4、++編譯后在符號庫中的名字與C語言的不同。例如,假設(shè)某個函數(shù)的原型為:voidfoo(intx,inty);該函數(shù)被C編譯器編譯后在符號庫中的名字可能為_foo,而C++編譯器則會產(chǎn)生像_foo_int_int之類的名字(不同的編譯器可能生成的名字不同,但是都采用了相同的機(jī)制,生成的新名字稱為“mangledname”)。_foo_int_int這樣的名字包含了函數(shù)名、函數(shù)參數(shù)數(shù)量及類型信息,C++就是靠這種機(jī)制來實現(xiàn)函數(shù)重載的。下面以例子說明,如何在C++中使用C的函數(shù),或者在C中使用C++的函數(shù)。//C++引用C函數(shù)的例子//test.c

5、#includevoidmytest(){printf("mytestin.cfileok");}//main.cppextern"C"{voidmytest();}intmain(){mytest();return0;}//在C中引用C++函數(shù)在C中引用C++語言中的函數(shù)和變量時,C++的函數(shù)或變量要聲明在extern"C"{}里,但是在C語言中不能使用extern"C",否則編譯出錯。//test.cpp#includeextern"C"{voidmytest(){printf("mytestin.

6、cppfileok");}}//main.cvoidmytest();intmain(){mytest();return0;}//綜合使用一般我們都將函數(shù)聲明放在頭文件,當(dāng)我們的函數(shù)有可能被C或C++使用時,我們無法確定是否要將函數(shù)聲明在extern"C"里,所以,我們應(yīng)該添加#ifdef__cplusplusextern"C"{#endif//函數(shù)聲明#ifdef__cplusplus}#endif如果我們注意到,很多頭文件都有這樣的用法,比如string.h,等等。//test.h#ifdef__cplusplus#include

7、ostream>usingnamespacestd;extern"C"{#endifvoidmytest();#ifdef__cplusplus}#endif這樣,可以將mytest()的實現(xiàn)放在.c或者.cpp文件中,可以在.c或者.cpp文件中include"test.h"后使用頭文件里面的函數(shù),而不會出現(xiàn)編譯錯誤。//test.c#include"test.h"voidmytest(){#ifdef__cpluspluscout<<"coutmytestexternok"<

8、xternokn");#endif}//main.cpp#include"test.h"intmain(){mytest();return0;}extern"C"的

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文

此文檔下載收益歸作者所有

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動畫的文件,查看預(yù)覽時可能會顯示錯亂或異常,文件下載后無此問題,請放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫負(fù)責(zé)整理代發(fā)布。如果您對本文檔版權(quán)有爭議請及時聯(lián)系客服。
3. 下載前請仔細(xì)閱讀文檔內(nèi)容,確認(rèn)文檔內(nèi)容符合您的需求后進(jìn)行下載,若出現(xiàn)內(nèi)容與標(biāo)題不符可向本站投訴處理。
4. 下載文檔時可能由于網(wǎng)絡(luò)波動等原因無法下載或下載錯誤,付費完成后未能成功下載的用戶請聯(lián)系客服處理。