struct TestStruct
{
int a;
int b;
union
{
char c[2];
int d;
};
};
TestStruct instance;
Run Code Online (Sandbox Code Playgroud)
如果我做
instance.a = 100;
instance.b = 200;
instance.d = 300;
Run Code Online (Sandbox Code Playgroud)
一切安好.
但是,如果我给工会一个名字:
struct TestStruct
{
int a;
int b;
union ZZZ // Note here!!
{
char c[2];
int d;
};
};
TestStruct instance;
Run Code Online (Sandbox Code Playgroud)
我又做了同样的事情:
instance.a = 100;
instance.b = 200;
instance.ZZZ::d = 300;
Run Code Online (Sandbox Code Playgroud)
然后
instance.ZZZ::d = 300;
Run Code Online (Sandbox Code Playgroud)
覆盖instance.a是300,为什么?!
此外,如果它具有名称,我无法在调试器监视列表中看到联合成员.
我正在使用Visual Studio 2008.
当您为联合命名时,类中不再有与之对应的数据成员,d因此instance.ZZZ::d = 300;并不意味着什么.(使用VS2012,我得到"错误C2039:'ZZZ':不是'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;
Run Code Online (Sandbox Code Playgroud)
C++对"匿名联合"有一个特殊规则,其中表单的未命名联合类型也会创建一个未命名的对象.union的成员名称被注入封闭范围并访问未命名对象的成员.union { member-specification };
当你没有在班级中命名联合类型时,这就是你得到的.但是只要你给类型命名,联合就不再匹配那个特殊规则了,并且在类中不再有一个未命名的联盟成员; 然后,您必须通过命名成员变量来正常添加联合数据成员.
| 归档时间: |
|
| 查看次数: |
1538 次 |
| 最近记录: |