Cについて質問があり、構造体のメンバーにアクセスする場合にのみ、部分的なタイプの「継承」をモックしようとしています。次の例を見てください。
#pragma pack(push,1)
typedef struct foo
{
int value;
int value2;
}foo;
typedef struct foo_extended
{
// "inherits" foo
int value;
int value2;
// "inherits" foo stops
//we also have some additional data
float additional;
}foo_extended;
#pragma pack(pop)
//! This function works for both foo types
void workboth(void* objP)
{
foo* obj = (foo*)objP;
obj->value = 5;
obj->value2 = 15;
}
//! This works only for the extended
void workextended(foo_extended* obj)
{
obj->value = 25;
obj->value2 = 35;
obj->additional = 3.14;
}
int main()
{
foo a;
foo_extended b;
workboth(&a);
workboth(&b);
workextended(&b);
return 0;
}
これは私のシステムでは機能しますが、関連する構造が正しくパッキングされている限り (コンパイラによっては)、これを移植できるかどうかという質問があります。他のコンパイラでもタイトなパッキングを正しく呼び出す #ifndefs が必要になると思います。
もちろん、明らかな問題は、型チェックが完全に欠如していて、正しい使用法の責任をすべてプログラマーに負わせていることですが、これが移植可能かどうかは疑問です。ありがとう!
PS: 私が準拠しようとしている標準は C99 であることを忘れていました。