如何在C代码中存储c++对象

How to store a C++ object in C code?

本文关键字:存储 c++ 对象 代码      更新时间:2023-10-16

我有调用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;

您应该使用typedefvoid*,如:

// 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向下滚动到"修改普通旧数据的定义",我想你会发现它很有用。: -)