我在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;
}
因此:
- 这真的是个问题吗
- 如果是,在C和C之间共享该指针的最佳方式是什么++
这本身不是问题,但如果在C++代码中将void *
强制转换回Mgr::Obj *
,则可能会违反严格的别名规则。
对此没有好的解决方案——(对我来说(这是标准中的一个明显遗漏。您能做的最好的事情就是编译任何使用-fno-strict-aliasing
标志进行此类强制转换的代码。我做得很广泛,从来没有遇到过以这种方式表演演员阵容的问题。