2
struct TestStruct
{   
    int a;
    int b;

    union
    {
        char c[2];
        int d;
    };
};

TestStruct instance;

如果我做

instance.a = 100; 
instance.b = 200; 
instance.d = 300;

一切安好。

但是,如果我给联合命名:

struct TestStruct
{   
    int a;
    int b;

    union ZZZ // Note here!!
    {
        char c[2];
        int d;
    };
};

TestStruct instance;

我再次做同样的事情:

instance.a = 100;
instance.b = 200;
instance.ZZZ::d = 300;

然后

instance.ZZZ::d = 300;

是覆盖instance.a300,为什么?!

此外,如果有名称,我无法在调试器监视列表中看到工会成员。

我正在使用 Visual Studio 2008。

4

1 回答 1

9

当您命名联合时,对应的类中不再有数据成员,d因此instance.ZZZ::d = 300;没有任何意义。(使用 VS2012 我得到“错误 C2039: 'ZZZ' : is not a member of 'TestStruct'”)

要拥有联合类型的成员,您必须为其命名。

struct TestStruct
{   
    int a;
    int b;

    union ZZZ // Note here!!
    {
        char c[2];
        int d;
    } z;
};

instance.a = 100;
instance.b = 200;
instance.z.d = 300;

C++ 对“匿名联合”有一个特殊规则,其中形式的未命名联合类型也会创建一个未命名对象。联合成员的名称被注入封闭范围并访问未命名对象的成员。union { member-specification };

这就是你在类中没有命名联合类型时得到的结果。但是,一旦您给类型命名,联合就不再符合该特殊规则,并且类中不再有未命名的联合成员;然后,您必须通过命名成员变量来正常添加联合数据成员。

于 2013-10-07T10:59:36.240 回答