我有一個C ++庫,其中提供了用于管理數(shù)據(jù)的各種類。我有該庫的源代碼。我想擴展C ++ API以支持C函數(shù)調(diào)用,以便該庫可以與C代碼和C ++代碼同時使用。我正在使用GNU工具鏈(gcc,glibc等),因此語言和體系結構支持不是問題。有什么原因?qū)е逻@在技術上是不可能的?我需要注意任何陷阱嗎?是否有與此相關的資源,示例代碼和/或文檔?我發(fā)現(xiàn)的其他一些內(nèi)容:使用以下代碼包裝C代碼需要使用的C ++標頭。#ifdef __cplusplusextern "C" { #endif // // Code goes here ... // #ifdef __cplusplus } // extern "C" #endif將“真實的” C ++接口保留在C不包含的單獨的頭文件中。在這里考慮PIMPL原理。#ifndef __cplusplus #error在這里使用東西有助于發(fā)現(xiàn)任何瘋狂。小心C ++標識符作為C代碼中的名稱C和C ++編譯器之間的枚舉大小不同。如果您使用的是GNU工具鏈,則可能不是問題,但仍要當心。對于結構,請遵循以下格式,以免C混淆。typedef struct X { ... } X然后使用指針傳遞C ++對象,只需要在C中將它們聲明為struct X,其中X是C ++對象。所有這些都是由一位C ++向?qū)У呐笥烟峁┑摹?
4 回答

繁華開滿天機
TA貢獻1816條經(jīng)驗 獲得超4個贊
C ++ FAQ Lite:“如何混合C和C ++代碼”。
這些問題的答案描述了一些陷阱:
[32.8]如何將C ++類的對象傳遞給C函數(shù)或從C函數(shù)傳遞?
[32.9]我的C函數(shù)可以直接訪問C ++類的對象中的數(shù)據(jù)嗎?

慕尼黑8549860
TA貢獻1818條經(jīng)驗 獲得超11個贊
主要陷阱:C語言無法捕獲異常。如果C ++代碼中可能出現(xiàn)異常,請非常小心地編寫C代碼或C ++包裝器。相反,C語言中的異常機制(如longjump)(在各種腳本語言中可以找到)不需要為堆棧上的C ++對象調(diào)用析構函數(shù)。

月關寶盒
TA貢獻1772條經(jīng)驗 獲得超5個贊
您可以混合使用C / C ++代碼。如果您的main()函數(shù)使用C ++編寫,則只需確保聲明了c函數(shù)
extern "C"
如果您的main是C,那么除了靜態(tài)變量外,您可能還可以。任何帶有靜態(tài)變量的構造函數(shù)都應在main()開始之前調(diào)用。如果C是您的主要角色,則不會發(fā)生這種情況。我有很多靜態(tài)變量,最好的辦法是用單例替換靜態(tài)變量。
- 4 回答
- 0 關注
- 476 瀏覽
添加回答
舉報
0/150
提交
取消