![](/img/trans.png)
[英]How to define C-forward declared opaque struct with a templated C++ struct
[英]Define forward declared C-struct as C++-struct
將struct
轉發為C struct
是否合法
// api.h
#ifdef __cplusplus
extern "C" {
#endif
typedef struct handle_tag handle_t;
handle_t *construct();
void destruct(handle_t *h);
void func(handle_t *h);
#ifdef __cplusplus
}
#endif
然后將其定義為C ++ - struct
,即作為非POD類型?
// api.cpp
struct handle_tag {
void func();
std::string member;
};
void func(handle_t *h) {
h->func();
}
一般意圖是通過C接口獲得一個外部可訪問的opaque類型handle_t
,它在內部實現為C ++數據類型。
是的,只要C代碼永遠不需要看到handle_tag
結構的“內部”,並且C ++代碼執行適當的C ++構造/銷毀(我預先假定construct
和destruct
用於),這將正常工作。
C代碼需要的只是指向某個數據結構的指針 - 它不知道內容是什么,所以內容可以是你喜歡的任何內容,包括構造函數/析構函數依賴數據。
編輯:我應該指出這個或類似於它的方法(例如,使用void *
來記錄C部分要hold
的對象的地址),這是將C代碼與C ++功能接口的一種相當常見的方式。
Edit2:調用的C ++代碼不會將異常“泄漏”到C代碼中,這一點至關重要。 這是未定義的行為,並且非常容易導致崩潰,或者更糟糕的是,“奇怪的事情”不會崩潰...所以除非保證代碼不會導致異常(例如std::string
容易拋出在內存不足的情況下bad_alloc
),需要在代碼中使用try/catch
塊,比如在C ++端construct
anf func
。
不會像現在這樣工作,但概念還可以。 定義函數后,還需要確保名稱不會被破壞,以便C代碼可以找到它們。 這意味着#include "api.h"
應該添加到api.cpp文件的頂部。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.