我希望这不是一个重复的问题,但我已经进行了一些详细搜索,但之前没有找到我的确切案例。
我有一个简单的结构,我也希望能够将其作为简单的字节数组进行访问
union
{
struct
{
unsigned char a;
unsigned char b;
// ... Some other members ...
unsigned char w;
};
unsigned char bytes[sizeof( what? )];
} myUnion;
请注意,该结构没有命名,也没有给它自己的成员名称。这样我就可以使用 myUnion.a
访问该成员,而不是 myUnion.myStruct.a
。
但是,如果没有一些名称,除了每次更改内容时手动计算之外,我如何才能获得 myUnion.bytes[]
的结构大小?
我目前的解决方法是使用 #define
来弥补 myUnion.myStruct
问题,但这会破坏我的自动完成功能在编辑器中,也使我的数据结构更难理解。
有什么想法吗?
注意:这是在 8 位处理器上运行的。单词对齐等没有问题。也就是说,可能应该说明任何注意事项,以免其他人不恰本地使用建议的解决方案。
最佳答案
只是摆脱 union 。您可以通过将其地址转换为 char*
来安全地访问任何可简单复制的结构作为字节数组,并且当您从不活动的 union 成员读取时,转换不会与未定义的行为发生冲突。
struct
{
unsigned char a;
unsigned char b;
// ... Some other members ...
unsigned char w;
// array-style access
unsigned char& operator[](size_t i)
{ return reinterpret_cast<unsigned char*>(this)[i]; }
} myStruct;
以这种方式转换是安全的原因是 char
是严格别名限制的特殊异常(exception)。
对于 union ,您获得的唯一特殊权限是访问成员,这些成员是“共享公共(public)初始序列的标准布局结构”……不幸的是,数组不符合“标准布局结构”的标准”。我希望看到该规则更改为“标准布局结构或聚合”,但在当前的措辞中, union 版本并不安全。
在 C99 中,但不是任何版本的 C++,您可以使用灵活的数组成员,根本不需要指定大小。
union
{
struct
{
unsigned char a;
unsigned char b;
// ... Some other members ...
unsigned char w;
};
unsigned char bytes[];
} myUnion;
罢工><罢工>罢工>
关于c++ - 在 union 中获取 sizeof 匿名结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23525861/