如何在 C 中声明指向嵌套 C++ class 的指针

How to declare a pointer to a nested C++ class in C

我在 C++ 中有一个嵌套的 class,我希望 C 代码能够使用它。因为它是嵌套的,所以我不能将它转发给 C,所以我们在共享 header 文件中有这样的代码:

#ifdef __cplusplus
class Mgr {
public:
    class Obj {
        public:
        int x;
    };
};

typedef Mgr::Obj * PObj;
#else

typedef void* PObj;

#endif

这导致 C 和 C++ 各自看到不同的 PObj 定义,我担心这违反了一个定义规则。然而它“只是”一个指针,所以我不确定这是否会出错。

C 除了将指针传递给作为方法包装器的 C++ 函数外,C 对指针不做任何事情。例如,我们将在组合 header:

#ifdef __cplusplus
extern "C" {
#endif
int obj_GetX(PObj pObj);

#ifdef __cplusplus
}
#endif /* __cplusplus */

以此作为C++文件中的实现:

int obj_GetX(PObj pObj) {
    return pObj->x;
}

所以:

  1. 这真的是个问题吗?
  2. 如果是这样,在 C 和 C++ 之间共享此指针的最佳方法是什么

这本身不是问题,但如果您在 C++ 代码中将 void * 转换回 Mgr::Obj *,则可能会违反 strict aliasing 规则。

对此没有好的解决方案——(对我而言)这是标准中的一个明显遗漏。您能做的最好的事情就是编译任何使用 -fno-strict-aliasing 标志进行此类转换的代码。我广泛地这样做并且以这种方式执行转换时从未遇到过问题。