我上包裹C中的C A C++庫工作分配不完全類型++庫爲數據庫服務器的庫。它使用包裝類來傳遞序列化數據。我不能用C直接使用該類,所以定義了可以在C代碼中使用這樣一個結構:堆棧
在include/c-wrapper/c-wrapper.h
(這是我的C包裝的客戶機包括包裝器)
extern "C" {
typedef struct Hazelcast_Data_t Hazelcast_Data_t;
Hazelcast_Data_t *stringToData(char *str);
void freeData(Hazelcast_Data_t *d);
}
在impl.pp
extern "C" struct Hazelcast_Data_t {
hazelcast::client::serialization::pimpl::Data data; // this is the C++ class
};
Hazelcast_Data_t *stringToData(char *str) {
Data d = serializer.serialize(str);
Hazelcast_Data_t *dataStruct = new Hazelcast_Data_t();
dataStruct->data = d;
return dataStruct;
}
...
現在這個工程,我的C庫的客戶端只看到typedef struct Hazelcast_Data_t Hazelcast_Data_t;
。問題是,上述類型不能在棧上分配,如果我想喜歡提供API這樣的:
// this is what I want to achieve, but Hazelcast_Data_t is an incomplete type
#include <include/c-wrapper/c-wrapper.h>
int main() {
char *str = "BLA";
Hazelcast_Data_t d;
stringToData(str, &d);
}
編譯器將拋出一個錯誤,Hazelcast_Data_t是一個不完整的類型。我仍然希望提供一個允許將棧分配參考Hazelcast_Data_t
傳遞給序列化函數的API,但由於Hazelcast_Data_t
有一個指向C++類的指針,這看起來幾乎是不可能的。然而,選擇傳遞堆棧分配引用會大大簡化我的C庫客戶端的代碼(無需釋放new
ed結構)。
是它在某種程度上是可行的重新定義Hazelcast_Data_t
類型,以便它可以在C中使用,並且仍然在棧上分配的?
Hazelcast_Data_t是否確實包含指向C++類的指針,還是包含實際的C++結構體或類對象?如果它實際上只是一個指針,那麼你應該沒有太多問題,因爲即使對於不完整的類型(即其總是4或8個字節,取決於你的系統),指針的大小也是衆所周知的。您可能必須將指針存儲爲(void *),以便C編譯器更易於理解,但除此之外,我不明白爲什麼它會出現問題。 –
@JeremyFriesner Hazelcast_Data_t包含實際數據。我也認爲我可以使用一個void指針,但是我不能將'Hazelcast_Data_t data'強制轉換爲'void *',我不能把它作爲地址,因爲它是一個本地堆棧變量。 – Max
投票結束的人:請幫我理解爲什麼不清楚我的問題中提問的內容。我對C/C++編程還很陌生,可能使用了錯誤的術語來描述我的問題。投票結束「不清楚」的理由根本不能幫助我。 – Max