代码之家  ›  专栏  ›  技术社区  ›  Boris

C结构嵌入联合中的成员对齐

  •  1
  • Boris  · 技术社区  · 14 年前

    我正在修改一些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 问题实际上提供了我需要的答案: 指向联合对象的指针,经过适当转换后,指向它的每个成员(或者如果成员是位域,则指向它所在的单元),反之亦然。 .

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

    2 回复  |  直到 12 年前
        1
  •  1
  •   rmk    14 年前

    你调查过吗 __attribute__ ?

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

    也许你可以用这个来确定你需要的是一致的?

        2
  •  1
  •   INS    14 年前

    pragma pack 在Visual Studio中,如果您也使用此编译器。