Cに関する質問があり、構造体のメンバーにアクセスする場合にのみ、 "継承"の部分型を模倣しようとしています。次の例を見てください: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を別のコンパイラでもきちんと詰め込んで呼び出す必要があると思います。
もちろん明らかな問題は、型チェックの完全な欠如と正しい使用法の責任のすべてをプログラマーに任せていることですが、移植性があるかどうかは疑問です。ありがとう!
P.Sは:私が付着しようとすると、標準のは、私は少し異なる方法を持っているC99
ありがとうございます。私はC99と互換性があるので、これは私の質問に答えます。私の質問で言及するのを忘れた – Lefteris
うーん、私はあなたが引用しているテキストからあなたの結論を引き出す方法を参照してくださいない。それらの順序が同じで、アラインメントがその型に適切であることだけを保証します。フィールドが異なると、 'foo'の内部パディングが変更されないことは何も言いません。 –
はい、もちろん@JensGustedt。しかし、実装者は、構造的に異なる実装の詳細を持つためにはプログラマが積極的にプログラマになる必要があります。例えば、2人または3人のmenbersと言うと... – pmg