1

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つを受け入れられた回答として選択する必要がありますか?

4

2 に答える 2

1

このコンパイラを (また) 使用する場合は、Visual Studio のpragma packを参照してください。

于 2010-06-24T19:15:32.040 に答える
1

調査しました__attribute__か?

http://gcc.gnu.org/onlinedocs/gcc-4.0.0/gcc/Type-Attributes.html

これを使用して、必要なものが揃っていることを確認できますか?

于 2010-06-24T17:25:35.310 に答える