【问题标题】:member alignment in c struct-embedded unionc struct-embedded union中的成员对齐
【发布时间】:2011-03-07 22:32:59
【问题描述】:

我正在修改一些 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)不会在联合的开头对齐?

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

无论如何,我是否应该为这个问题选择一个答案作为接受的答案?

【问题讨论】:

    标签: c struct alignment unions offsetof


    【解决方案1】:

    你调查过__attribute__吗?

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

    也许你可以通过使用它来确保你需要的东西是一致的?

    【讨论】:

    • 谢谢,我去看看。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-08
      • 1970-01-01
      • 2023-01-17
      • 1970-01-01
      • 2017-11-01
      • 2019-04-28
      • 1970-01-01
      相关资源
      最近更新 更多