在许多情况下,我发现我想访问联合中的原始数据,但是我不想计算大小,或者想保持其灵活性。
例如(有点人为,但我希望它传达了这个想法),如果我更改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 ++中未定义的行为。您能否提供一些有关此的其他信息?
答案 0 :(得分:1)
也许
typedef union
{
struct _struct
{
uint8_t bar[32];
othertype_t foo[4];
};
uint8_t raw[sizeof(struct _struct)];
} sometype_t;