原始访问联合数据

时间:2018-08-11 12:47:13

标签: c

在许多情况下,我发现我想访问联合中的原始数据,但是我不想计算大小,或者想保持其灵活性。

例如(有点人为,但我希望它传达了这个想法),如果我更改othertype_t的外观,我不想调整raw的大小:

#pragma pack(push, 1)
typedef union {
  uint8_t raw[0];
  struct {
    uint8_t bar[32];
    othertype_t foo[4];
  };
} sometype_t;
#pragma pack(pop)

后来我可以做类似sizeof(union sometype_t)的事情来了解raw的大小。

使用raw [0]可以工作,但是我知道这是gcc非标准扩展名。我该如何以更便携的方式进行此操作?

作为一个“技巧”,我可以做类似raw[1]的事情,但是感觉有点误导。

更新: 有人指出这是C ++中未定义的行为。您能否提供一些有关此的其他信息?

1 个答案:

答案 0 :(得分:1)

也许

typedef union 
{
  struct _struct
  {
    uint8_t bar[32];
    othertype_t foo[4];
  };
  uint8_t raw[sizeof(struct _struct)];
} sometype_t;