c struct-embedded union中的成员对齐

时间:2010-06-24 17:21:44

标签: c struct alignment unions offsetof

我正在修改一些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);

显然,当使用union的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)在联合开始时不会对齐?

- 编辑:感谢您的回答。 this问题的答案实际上为我提供了我需要的答案:指向联合对象的指针,适当转换,指向其每个成员(或者如果成员是位域,则指向单元它居住在其中,反之亦然。

我应该选择这个问题的答案之一作为接受的答案吗?

2 个答案:

答案 0 :(得分:1)

您是否调查了__attribute__

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

也许你可以通过使用它来确保你需要的是什么?

答案 1 :(得分:1)

如果您(也)使用此编译器,请参阅Visual Studio中的pragma pack