2011-04-22 57 views
4

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

回答

6

void。像这样:

typedef struct THESTRUCT { 
    void* objectPtr; 
} THESTRUCT; 

void*是一个“通用”指针类型。 (你必须将它转换为其他类型才能使用它,因为在C端没有类型,所以它实际上是一个不透明的指针。)

另一种方法是为C++创建一个前向声明类型,而无需定义它(因为在C端不可能)。所以,如果你的C++类型称为foo,你可以这样做:

struct foo; 
typedef struct THESTRUCT { 
    struct foo* objectPtr; 
} THESTRUCT; 
+1

那么,大家都同意 - 但我只能选择一个作为答案,所以我选择了其他人投票最多的那个! – Elsa 2011-04-22 06:35:19

0

一种解决方案是存储void*。您可以尝试存储正确的类型指针,但C不会识别正确的类型,因此您可以使用void*意思是“任何指针”。

2

您应该使用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); 
    // ... 
} 
0
extern "C" void cppFn(void** objectPtr) 
{ 
    (Object*)(*objectPtr) = new Object(); 
} 
void cFn() 
{ 
    THESTRUCT theStruct = {0}; 
    cppFn(&(theStruct.objectPtr)); 
} 
typedef struct THESTRUCT { 
    void* objectPtr; 
} THESTRUCT; 
0

使用void *用于此目的为C不知道确切的类型

void *是存储指针的简单方法任何类型的;所以我想这个解决方案很适合这里