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

例如(有点人为,但我希望它传达了这个想法),如果我更改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 ++中未定义的行为。您能否提供一些有关此的其他信息?

最佳答案

也许

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

关于c - 原始访问 union 数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51799851/

10-15 00:48