さまざまなC および C++コードで ( 経由で)使用される C 構造体がありextern "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*
sを単純にキャストしA*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);
}
これにはさらに問題がありますか、それともまったく別の方法で行う必要がありますか?