如何在C代码中存储c++对象
How to store a C++ object in C code?
我有调用c++代码的C代码。c++代码创建一个对象,然后将其传递给C代码,C代码将该对象存储在一个结构体中:
extern "C" void cppFn(?** objectPtr)
{
*objectPtr = new Object();
}
void cFn()
{
THESTRUCT theStruct = {0};
cppFn(&(theStruct.objectPtr));
}
typedef struct THESTRUCT
{
?* objectPtr;
} THESTRUCT;
我的问题:objectPtr的可接受类型是什么?
void
。像这样:
typedef struct THESTRUCT {
void* objectPtr;
} THESTRUCT;
void*
是一个"泛型"指针类型。(您必须将其强制转换为其他类型才能使用它。由于在C端没有可将其强制转换为的类型,因此它实际上是一个不透明的指针。)
另一种方法是为c++类型做一个前向声明,而不定义它(因为这在C端是不可能做到的)。所以如果你的c++类型是foo
,你可以这样做:
struct foo;
typedef struct THESTRUCT {
struct foo* objectPtr;
} THESTRUCT;
您应该使用typedef
到void*
,如:
// C++ header
class SomeObject {
// ...
};
// C header
#ifdef __cplusplus
# define EXTERNC extern "C"
#else
# define EXTERNC
#endif
typedef void* SomeObjectPtr;
EXTERNC void cppFun(SomeObjectPtr);
// C++ implementation of C header
EXTERNC void cppFun(SomeObjectPtr untyped_ptr) {
SomeObject* ptr = static_cast<SomeObject*>(untyped_ptr);
// ...
}
一个解决方案是存储void*
。您可以尝试存储正确类型的指针,但C无法识别正确的类型,因此您可以使用void*
表示"任何指针"。
extern "C" void cppFn(void** objectPtr)
{
(Object*)(*objectPtr) = new Object();
}
void cFn()
{
THESTRUCT theStruct = {0};
cppFn(&(theStruct.objectPtr));
}
typedef struct THESTRUCT {
void* objectPtr;
} THESTRUCT;
使用void *
,因为C不知道确切的类型
void *
是存储任何类型指针的简单方法;所以我想这个解决方案很适合这里
http://en.wikipedia.org/wiki/C%2B%2B11向下滚动到"修改普通旧数据的定义",我想你会发现它很有用。: -)
相关文章:
- 将字符串存储在c++中的稳定内存中
- std::原子加载和存储都需要吗
- C++:将控制台输出存储在宏中更好吗
- 使用QProcess执行命令,并将结果存储在QStringList中
- 访问存储在向量C++中的结构的多态成员
- 如何从存储在std::映射中的std::集中删除元素
- 存储模板类型以强制转换回派生<T>
- 类型总是使用其大小存储在内存中吗
- 当字符串存储在变量中时,如何将字符串转换为wchar_t
- 使用无符号字符数组有效存储内存
- 如何在cpp.中使用协议缓冲区存储大缓冲区/数组(char/int)
- 使用 pqxx 将 std::vector 存储在 postgresql 中,并从数据库中检索它
- 带结构的二维矢量:如何存储元素
- 添加存储在向量中的大整数的函数出现问题
- 从文件中读取多个字节,并将它们存储在C++中进行比较
- 在std::vector上存储带有模板的类实例
- 谷歌测试中的期望值存储在哪里
- 为什么C中的通用链表中存储的数据已损坏
- 在c++中获取两个大int,并将它们存储在数组中
- 在reactor中存储eventHandlers的最佳方式是什么