是否有什麼祕訣可以給我說說傳遞指針結構,雙打,功能,...從C程序的C++庫,回來了?傳遞指針到C++,反之亦然
回答
假設你在兩個不同的庫靜態或動態(DLL文件在Linux和其他* nix的變種窗口共享庫)我最關心的問題,這些編碼如下:
它們使用相同的編譯器進行編譯。雖然如果所有C++導出都使用C樣式命名約定導出,則這不是必需的,但C++到C++調用兩個C++模塊之間的類實例是必需的。這是必要的,因爲不同的編譯器如何以不同的方式修改C++導出。
不要將C++類轉換爲C結構體。即使字段的佈局相同,它們在封面下也不盡相同。如果C++類有任何虛擬成員,則它們具有「v-表」;這個v表允許正確調用繼承或基類方法。
這是C 1至C或C++來C++以及爲C的真實的C++。確保兩個輸出庫使用相同的字節對齊方式。您只能通過閱讀您的編譯器或開發環境文檔來確定這一點。
請勿將malloc/free與new/delete混合使用。更具體地說,不要使用「free」分配帶有新的可用內存的內存,反之亦然。許多編譯器和操作系統在兩者之間處理內存管理的方式不同。
傳遞函數指針:只要它們暴露到/從C++作爲「」外部的「C」「」這應該是很好。 (您需要引用編譯器文檔,瞭解如何確定將頭文件編譯爲C或C++以將其保存在一個文件中,還是需要在每個項目中使用相同函數聲明的兩個獨立副本 - I建議第一)
傳遞雙打:這是一個內置在C和C++型和應處理是相同的。
如果您必須與C函數共享C++對象的實例並在C代碼中對其進行操作,請公開一組C++導出的助手函數,這些函數會調用C++對象上適當的方法。純C代碼無法在C++對象上正確調用方法。
Pseudocode-ish Example:
// C++ class
class foo {
public:
void DoIt();
};
// export helper declarations
extern "C" void call_doit(foo* pFoo);
extern "C" foo* allocate_foo();
extern "C" deallocate_foo(foo* pFoo);
// implementation
void call_doit(foo* pFoo)
{
pFoo->DoIt();
}
foo* allocate_foo()
{
return new foo();
}
deallocate_foo(foo* pFoo)
{
delete pFoo;
}
// c consumer
void main()
{
foo* pFoo= allocate_foo();
call_doit(pFoo);
dealocate_foo(pFoo);
}
可能值得閱讀本文: http:///stackoverflow.com/questions/2045774/developing-c-wrapper-api-for-object-oriented-c-code – 2010-01-16 05:54:15
- 不要忘了爲extern 「C」關鍵字 避免問題與C++重整 名。
- 不要使用通過引用傳遞的參數類型,但指針
- 1. PHP到C#反之亦然
- 2. 傳遞一個FORTRAN對象到C,反之亦然
- 3. 將雙指針轉換爲單指針,反之亦然
- 4. 填充JSON到C#類,反之亦然
- 5. XAML到Html,反之亦然
- 6. 將參數從Java傳遞到Python,反之亦然
- 7. 從ActiveX傳遞字節數組到JavaScript,反之亦然
- 8. 從傳遞到活動和FragmentDialog反之亦然
- 9. 如何將數據從Javascript傳遞到PHP,反之亦然?
- 10. 何時通過指針使用數組,或反之亦然
- 11. 將指針表示爲字符串,反之亦然
- 12. 如何將指針轉換爲整數,反之亦然?
- 13. 使用JNI將結構從java傳遞到C代碼,反之亦然
- 14. 用c#與javascript交談,反之亦然
- 15. 將數據結構從java傳遞給perl(反之亦然)
- 16. 傳遞結構條目的字符串,反之亦然
- 17. 如何從JavaScript值傳遞給HTML,反之亦然
- 18. 這不是如何將PHP值傳遞給JS,反之亦然?
- 19. 將整數傳遞給int,反之亦然
- 20. 是一個指向可轉換爲void指針的函數指針的指針,反之亦然?
- 21. NSImage cv :: Mat,反之亦然
- 22. hadoop mapreduce反之亦然
- 23. boost :: shared_ptr void *反之亦然
- 24. 長[]要長[],反之亦然?
- 25. C++傳遞指針
- 26. 流程圖到JSON和反之亦然
- 27. java.sql.Timestamp到Joda立即反之亦然
- 28. DeflateStream/GZipStream到CryptoStream的,反之亦然
- 29. 鑄造SOMETYPE **到SOMETYPE * [],反之亦然
- 30. TFS到GitHub和反之亦然同步
這是一般一個很好的問題,但是,讓您擁有更具體的問題會幫助社區爲例使用情況下提供最好的建議。 – 2010-01-16 04:41:54