【问题标题】:How to store a C++ object in C code?如何在 C 代码中存储 C++ 对象?
【发布时间】:2011-08-10 19:08:00
【问题描述】:

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


    【解决方案1】:

    void。像这样:

    typedef struct THESTRUCT {
        void* objectPtr;
    } THESTRUCT;
    

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

    另一种方法是为您的 C++ 类型进行前向声明,而不定义它(因为这在 C 端是不可能的)。因此,如果您的 C++ 类型称为 foo,您可以这样做:

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

    【讨论】:

    • 好吧,每个人都同意——但我只能选择一个作为答案,所以我选择了其他人投票最多的一个!
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      您应该使用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);
          // ...
      }
      

      【讨论】:

        【解决方案4】:
        extern "C" void cppFn(void** objectPtr)
        {
             (Object*)(*objectPtr) = new Object();
        }
        void cFn()
        {
            THESTRUCT theStruct = {0};
            cppFn(&(theStruct.objectPtr));
        }
        typedef struct THESTRUCT {
            void* objectPtr;
        } THESTRUCT; 
        

        【讨论】:

          【解决方案5】:

          为此使用void *,因为C 不知道确切的类型

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

          【讨论】:

            【解决方案6】:

            http://en.wikipedia.org/wiki/C%2B%2B11向下滚动到“修改普通旧数据的定义”,我想你会发现它很有用。 :-)

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2020-06-01
              • 1970-01-01
              • 2010-09-29
              • 2010-09-30
              • 2010-10-01
              • 2013-02-17
              • 1970-01-01
              相关资源
              最近更新 更多