c++ - 在 union 中获取 sizeof 匿名结构

标签 c++ c struct sizeof unions

我希望这不是一个重复的问题,但我已经进行了一些详细搜索,但之前没有找到我的确切案例。

我有一个简单的结构,我也希望能够将其作为简单的字节数组进行访问

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/

相关文章:

c - 二维指针的大小

C:二维数组的大小

c++ - 使用 shared_ptr<void> 初始化结构

c++ - 从文件加载结构

c++ - cmake:在安装时执行cmake命令

c - 关于在c中更改文件描述符编号的问题

c++ - 尝试使用 CMake 和 MinGW W64 构建时出现多个重新定义错误

c - 修改结构中的 char *

c++ - 以相反的顺序将一个 vector 复制到另一个 vector

c++ - SSE4.1 自动在较新的 gcc 上进行字符串比较