2011-01-07 60 views

回答

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;

+0

这真的很好,我不知道。你为我节省了很多击键! – GWW 2011-01-07 15:09:21

0

在这种情况下,您将结构(包含4个字节)和无符号整数(也是4个字节)映射到相同的内存位置。

+0

我想你错过了一点:OP知道工会是为了什么,他只是问工会内的无名结构。 – ereOn 2011-01-07 14:56:28

+0

阅读标题“你可能会用什么名字的结构或联盟?”我不认为我错过了整个观点。但是,当我重读它时,问题的最后一部分暗示了结构。 – 2011-01-07 15:07:59

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 ::向量或INT在我的例子[99])。但它有时可能有用。

+0

+1。这是一个很好的例子,当正确的答案没有任何投票,没有回答问题的帖子有6票 – 2011-01-07 15:50:44

5

这主要是因为struct和union非常相似。一般来说,只有在工会内部有匿名结构,在结构内部有匿名工会,但在工会内的结构或工会中嵌套结构大体上等同于直接列出其成员。

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