我正在从io设备接收四个字(32位)的数据。消息中的第一个单词告诉我要输入的数据是什么。我想知道这是使用union还是reinterpret_cast的情况。

这是我的用例...

struct Plain {
  uint32_t  type;
  uint32_t data1;
  uint32_t data2;
  uint32_t data3;
}
struct Special1 {
  uint32_t  type;
  uint32_t data1;
  float    data2;
  uint32_t data3;
}

struct Special2 {
  uint32_t  type;
  uint32_t data1;
  float    data2;
  uint16_t data3;
  uint16_t data4;
}
union My_union {
  Plain    p1;
  Special1 p2;
  Special2 p3;

}
void foo(const Special1& x);
void foo(const Special2& x);
int main() {
  My_union x;
  read(&x.p1, sizeof(Plain)); // read from an IO device
  if(x.p1.type == 1)
  {
    foo(x.p2);
  }
  else
  {
    foo(x.p3);
  }
  return 0;
}


我试图弄清楚这是否是使用工会的合适案例,还是仍然有 Actor 阵容,如果可以,为什么?

最佳答案

如果正确初始化了对象x,则if中的main()语句将是合法的,因为尽管C++标准的子句[class.union]/1中存在以下限制:



以下异常允许您访问公共(public)成员type:



但是您的代码段中的问题是,您创建了一个联合对象x而不激活其任何成员([basic.life] /1.2):



这意味着当没有成员处于 Activity 状态时,您直接将一些数据读入并集对象,因此仍然没有成员处于 Activity 状态。严格遵循该标准,我知道这完全无法保证。

正确的方法是读取type,然后将相关成员初始化为,并在其中读取其余的结构(或将所有内容读入缓冲区并按照类似策略进行复制)。但是,实际上,您的代码将在大多数编译器上运行。

10-08 09:16
查看更多