Cコードを少し変更しています。大まかに次のようになります。
typedef struct STRUCT_FOO {
ULONG FooInfo;
union {
ULONG LongData;
USHORT ShortData;
UCHAR CharData;
};
} FOO;
...
FOO foo;
ULONG dataLength = offsetof(FOO, CharData) + sizeof(foo.CharData);
明らかに、ユニオンの CharData メンバーを使用する場合、コードは構造体内の対象バイト数を把握しようとします。私の問題は、コンパイラが名前のない共用体について警告することです。だから私はそれを
typedef struct STRUCT_FOO {
ULONG FooInfo;
union {
ULONG LongData;
USHORT ShortData;
UCHAR CharData;
} FooData;
} FOO;
しかし、もちろん、最後の行も変更する必要があります。以下は常にオリジナルとまったく同じ結果をもたらすでしょうか?
ULONG dataLength = offsetof(FOO, FooData) + sizeof(foo.FooData.CharData);
または、CharData (または ShortData または LongData) がユニオンの先頭に配置されない可能性はありますか?
-- 編集: ご回答ありがとうございます。この質問に対する答えは、実際に私が必要としていた答えを提供してくれました:適切に変換されたユニオン オブジェクトへのポインターは、そのメンバーのそれぞれを指します (または、メンバーがビットフィールドの場合は、それが存在するユニットを指します)。逆に。.
とにかく、この質問に対する回答の1つを受け入れられた回答として選択する必要がありますか?