如何存储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代码中的对象? 我有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

我的问题:objectPtr使用的可接受类型是什么?

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;