簡體   English   中英

將前向聲明的C-struct定義為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 ++構造/銷毀(我預先假定constructdestruct用於),這將正常工作。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM