我有一个用于各种C 和 C++代码(通过extern "C"
)的 C 结构。
#ifdef __cplusplus
extern "C" {
#endif
typedef struct A A;
struct A {
/*some members*/
};
#ifdef __cplusplus
}
#endif
分配、初始化和释放是由我控制下的单独成员函数完成的,但我不控制对成员的访问,因为它们在任何地方都可以访问。
问题是,我无法更改struct
整个系统中大量使用的标头中的 ' 定义,但我仍然想扩展类型并添加一些成员。由于这必须同时编译为 C++ 和 C,因此我不能简单地创建派生类型struct B : public A
。所以我的想法是将这种类型添加到 cpp 文件中:
#ifdef __cplusplus
extern "C" {
#endif
typedef struct B B;
struct B {
A parent; // <---- public inheritance
/*some members*/
};
#ifdef __cplusplus
}
#endif
现在,我可以修改 cpp 文件中的所有函数,但我仍然必须A*
在编译单元之外分发和接受,因为没人知道是什么B
。
所以,我想知道是否有一种理智且定义明确的方式来做到这一点。我可以简单地将我B*
的 sA*s
来回转换还是必须显式转换它们:
A* static_cast_A(B* b) {
return &(b->parent);
}
B* static_cast_B(A* a) {
B* const b = 0;
unsigned const ptrdiff = (unsigned)((void*)(&(b->parent)));
return (B*)(((void*)a)-ptrdiff);
}
这是否还有其他问题,或者我应该完全不同吗?