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



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

#ifdef __cplusplus
class Mgr {
public:
class Obj {
public:
int x;
};
};
typedef Mgr::Obj * PObj;
#else
typedef void* PObj;
#endif

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

C除了将指针传递给作为方法包装器的C++函数之外,对指针不做任何操作。例如,我们将在组合标题中包含以下内容:

#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 *,则可能会违反严格的别名规则。

对此没有好的解决方案——(对我来说(这是标准中的一个明显遗漏。您能做的最好的事情就是编译任何使用-fno-strict-aliasing标志进行此类强制转换的代码。我做得很广泛,从来没有遇到过以这种方式表演演员阵容的问题。

相关内容

  • 没有找到相关文章

最新更新