編譯C和C++
回答
如果您需要調用不是extern "C"
的C++函數,那麼您必須自己從C++程序中執行此操作。您可以在項目中創建一個單獨的C++文件,該文件包含extern "C"
函數中需要的所有庫函數,供項目的其餘部分使用。你必須告訴自動工具你使用C和C++。文件擴展名應該足以決定哪個是哪個。
給你舉個例子,考慮一些libmagic
用C++編寫以下mymagic.cc
創建綁定:
#include <libmagic/magic.hh>
extern "C" {
int doMagic() {
magic::Wizard w("foo", 42);
magic::Result res = w.doMagic();
return res.getResultCode();
}
}
到應用程序的其餘部分,doMagic()
似乎只是另一個C函數。但裏面是C++,所以它可以使用任何你想要的C++結構。當你需要從庫中傳遞東西時,你應該使用指向不透明類型的指針。所以在頭mymagic.h
這也被你的C代碼,你可以寫
struct magicValue;
int doMagic(void);
struct magicValue* createMagic(void);
void destroyMagic(struct magicValue*);
而在mymagic.cc
你那麼更明確:
struct magicValue {
magic::value v;
magicValue(magic::value val) : v(val) { }
};
magicValue* createMagic() {
return new magicValue(magic::value("foo"));
}
void destroyMagic(magicValue*) {
delete magicValue;
}
所以我應該用extern「C++中的所有函數」創建一個main.c文件。但該函數的參數是C++? – dani 2012-08-01 08:57:29
@dani:如果KDIS沒有提供C接口,那麼你需要發明一個。這取決於你如何實現這一點,但通常你會發現自己在C中定義了opaque指針類型來引用C++中的對象類型,並且寫了很多形式爲'ReturnType Foo_method(Foo * self,other args)的函數。 ..){return self>方法(其他參數...); }'。 – 2012-08-01 09:08:15
@dani,我不確定我是否理解你的評論。但我添加了一些例子,希望能夠澄清一些事情。也看看鏈接SingerOfTheFall [提供](http://stackoverflow.com/a/11755623/1468366),他們似乎有更多的細節,如何不僅調用函數,而且以各種方式在C和C++。 – MvG 2012-08-01 09:19:52
- 1. C++編譯C++ 11
- 2. 用C++編譯器編譯c代碼
- 3. 後臺編譯VS2010和C/C++
- 4. 編譯和鏈接miracl C++
- 5. 「g ++」和「C++」編譯器
- 6. C++ cout和cin不編譯
- 7. 微軟C/C++編譯器的C編譯器和C++編譯器有什麼區別?
- 8. C#編譯智能編譯
- 9. 在C++編譯
- 10. C#反編譯
- 11. C++ Xcode編譯?
- 12. Xcode:strict C編譯?
- 13. 在C,編譯
- 14. C++編譯與
- 15. 在C++ builder中編譯C++
- 16. Eclipse的C/C++編譯faile
- 17. c/C++ boost - 編譯問題
- 18. 編譯C++的C模式
- 19. 生成C#編程和編譯...發出
- 20. 以編程方式調用C#編譯器編譯C#代碼
- 21. C++ - 編譯錯誤
- 22. 編譯amqsput0.c [MQ]
- 23. C++程序編譯
- 24. 試圖編譯C
- 25. 編譯mathgl C-例
- 26. 編譯C++程序
- 27. C++編譯錯誤
- 28. C++編譯錯誤
- 29. 編譯mongo-c-driver
- 30. 編譯錯誤c#
圖書館是否提供什麼類型的接口爲你? C還是C++? – 2012-08-01 08:39:01
一個C++接口 – dani 2012-08-01 08:39:49