如何存储C++;C代码中的对象? 我有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使用的可接受类型是什么?如何存储C++;C代码中的对象? 我有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;,c++,c,types,C++,C,Types,我的问题:objectPtr使用的可接受类型是什么?void。像这样: typedef struct THESTRUCT { void* objectPtr; } THESTRUCT; void*是一种“通用”指针类型。(您必须将其转换为其他类型才能使用它。由于在C端没有可转换的类型,因此它实际上是一个不透明指针。) 另一种方法是对C++类型进行前向声明,而不定义它(因为在C端不可能这样做)。所以如果你的C++类型被称为“代码> Foo”,你可以这样做: struct foo; typ
void
。像这样:
typedef struct THESTRUCT {
void* objectPtr;
} THESTRUCT;
void*
是一种“通用”指针类型。(您必须将其转换为其他类型才能使用它。由于在C端没有可转换的类型,因此它实际上是一个不透明指针。)
另一种方法是对C++类型进行前向声明,而不定义它(因为在C端不可能这样做)。所以如果你的C++类型被称为“代码> Foo”,你可以这样做:
struct foo;
typedef struct THESTRUCT {
struct foo* objectPtr;
} THESTRUCT;
一种解决方案是存储
void*
。您可以尝试存储正确的类型指针,但C无法识别正确的类型,因此您可以使用void*
表示“任意指针”。您应该使用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);
// ...
}
<代码> /C++头
类对象{
// ...
};
//C头
#ifdef_uucplusplus
#定义EXTERNC extern“C”
#否则
#定义外部
#恩迪夫
typedef void*SomeObjectPtr;
外部无效cppFun(SomeObjectPtr);
C标题的//C++实现
EXTERNC void cppFun(SomeObjectPtr非类型化\u ptr){
SomeObject*ptr=静态_-cast(非类型化_-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;