您可以使用无名结构或联合用于什么?

时间:2011-01-07 14:40:51

标签: c++

我可以看到

union {
uint32_t ip_address
 struct {
          uint8_t oct1;
          uint8_t oct2;
          uint8_t oct3;
          uint8_t oct4;
        };
};

可能对某人有用,但这里的struct示例中的struct: Detail of MS warning C4201似乎有点奇怪。谁能证明一个好的用例?

4 个答案:

答案 0 :(得分:12)

union中的无名struct有意义,因为它允许您在不指定名称的情况下引用联合的成员,因此代码更短:

struct {
  int a;

  union {
    int b, c, d;
  };
} foo;

因此,访问union的成员就像访问包含结构的成员一样:foo.afoo.b。否则,您必须使用foo.union_name.b来访问联盟的成员。

当然,使用此类结构的“用户”程序员应该知道设置foo.c会影响foo.bfoo.d的值。

出于同样的原因,可以进行相反的操作,即将匿名struct放入union

union {
  struct {
    int a, b;
  };

  int c;
} foo;

这种方式foo.afoo.b可以同时使用,而foo.c可以用于其他情况。

我想不出匿名结构或联合的任何其他用途。 “声明”匿名结构/联合是一种矛盾,就像说int;而不是int a;

答案 1 :(得分:5)

这主要是因为struct和union非常相似。一般来说,在联盟中使用匿名结构和结构中的匿名联合是有用的,但在联盟内的结构或联合内嵌套结构大致相当于直接列出其成员。

请注意,不应使用联合来转换值,因为绝对没有布局保证。

答案 2 :(得分:1)

您可以在结构或类中使用匿名结构来组合一些普通旧数据的值以简化实例的初始化(使用memset)但不能这样做,因为类派生自另一个。

例:

#include <string.h>
class Base
{
private:
    int field1;
    int field2;

public:
    Base()
    {
        // initialize field1, field2
    }

    virtual void DoSomething();
};

class Derived : public Base
{
private:
    struct
    {
        int field2;
        int field3;
        int field4;
        // ...
        int field99;
    } data;

public:
    Derived()
    : Base()
    {
        memset(&data, 0, sizeof(data));

        // if you didn't group those value in an anonymous struct
        // you would have to do something like that (not safe):
        // memset(sizeof(Base) + (char*)this, 0, sizeof(Derived) - sizeof(Base));
    }
};

请注意,存在更好的替代方案(在我的示例中使用std :: vector或int [99])。但它有时候很有用。

答案 3 :(得分:0)

在这种情况下,您将结构(包含4个字节)和unsigned int(也是4个字节)映射到同一个内存位置。