c與c函數的頭文件兼容宏定義

c與c函數的頭文件兼容宏定義

ID:8807646

大?。?7.50 KB

頁數:6頁

時間:2018-04-08

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

《c與c函數的頭文件兼容宏定義》由會員上傳分享,免費在線閱讀,更多相關內容在應用文檔-天天文庫。

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

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

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

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

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

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

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

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

當前文檔最多預覽五頁,下載文檔查看全文

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

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