如何在 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;
}
所以:
- 这真的是个问题吗?
- 如果是这样,在 C 和 C++ 之间共享此指针的最佳方法是什么
这本身不是问题,但如果您在 C++ 代码中将 void *
转换回 Mgr::Obj *
,则可能会违反 strict aliasing 规则。
对此没有好的解决方案——(对我而言)这是标准中的一个明显遗漏。您能做的最好的事情就是编译任何使用 -fno-strict-aliasing
标志进行此类转换的代码。我广泛地这样做并且以这种方式执行转换时从未遇到过问题。
我在 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;
}
所以:
- 这真的是个问题吗?
- 如果是这样,在 C 和 C++ 之间共享此指针的最佳方法是什么
这本身不是问题,但如果您在 C++ 代码中将 void *
转换回 Mgr::Obj *
,则可能会违反 strict aliasing 规则。
对此没有好的解决方案——(对我而言)这是标准中的一个明显遗漏。您能做的最好的事情就是编译任何使用 -fno-strict-aliasing
标志进行此类转换的代码。我广泛地这样做并且以这种方式执行转换时从未遇到过问题。