我上包裹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