无名结构/联合作为类私有成员

时间:2012-05-09 20:59:46

标签: c++ visual-c++ struct warnings

我正在处理一些代码,并发现了类似这样的事情:

class Foo
{
private:
  union {
    byte bar;
    struct {
      byte baz1;
      byte baz2;
    };
  };
};

现在,我正在编译VS 2010下的警告级别4(纯粹的非托管),当然VS抱怨无名结构/联合是非标准扩展(警告C4201),我想修复该警告。

是否有任何理由有人会更喜欢上述内容:

class Foo
{
private:
  byte bar;
  byte baz1;
  byte baz2;
};

或者将前者改为后者的任何理由都会破裂?

3 个答案:

答案 0 :(得分:1)

我相信你已经知道了 - 如果使用联盟 内存存储在union的成员之间共享。 您的第二个示例将为所有项目分配单独的存储空间 但第一个例子不会(在bar和匿名之间共享 结构)。

一般不建议使用无名结构/联合 看到这个网址:

Why does C++ disallow anonymous structs and unions?

我可以看到改变示例2到1的破坏,但不是1到2破坏 除非您依赖于共享存储的事实 一个联盟(这是非常糟糕的做法)..

答案 1 :(得分:1)

将编译器警告级别设置为4将发出此警告。

是的,有理由为什么有人会选择unionstruct。这两种数据结构非常不同。我不会在此处查明或反对union的原因,因为这超出了范围,但here's是一个链接。

如果你想保留工会,你可以这样做:

class Foo
{
private:
  union {
    int bar;
    struct {
      int baz1;
      int baz2;
    } thing_;
  };
};

请注意,Foo现在有一个名为thing_的成员union

答案 2 :(得分:0)

当然有理由。您的解决方案需要在内存中占用50%的空间作为带有union的版本。此外,通过联合,foo.bar = foo.baz1适用于所有Foo foo;