在这种情况下,C ++中的union会做什么?

时间:2017-01-13 20:52:32

标签: c++ unions

在我正在工作的一个类中,我在头文件中找到了类似的东西:

// Flags
union
{
    DWORD               _flags;
    struct {
        unsigned        _fVar1:1;
        unsigned        _fVar2:1; 
        unsigned        _fVar3:1; 
        unsigned        _fVar4:1;  
    };
};

在某些班级成员函数中,我看到_flags直接设置为_flags = 3;。 我还看到结构中的成员直接设置,如_fVar1 = 0并进行比较。

我正在尝试删除_fVar1,我不确定它会对访问或设置_flags和其他_fVar#的其他地方做些什么。 例如,设置_flags = 3是否意味着_fVar1_fVar2将为1而_fVar3_fVar4将为0?删除或添加到结构意味着我必须对触及联盟中任何其他成员的代码进行相应的更改吗?

2 个答案:

答案 0 :(得分:6)

C ++中不允许使用匿名成员结构(类),因此就标准而言,程序是不正确的。

访问union的非活动成员具有未定义的行为。

简而言之:无论它做什么都取决于编译器。

这两个都被允许在C中(前者不允许直到C11,后者直到C99),并且由一些编译器,作为C ++中的扩展(以及作为C的早期版本中的扩展)。我们假设你使用这样的编译器。

  

例如,设置_flags = 3是否意味着_fVar 1和_fVar2将为1而_fVar3_fVar4将为0?

这可能是意图。但是,行为取决于编译器为位字段选择的表示形式。

在不对表示进行假设的情况下,可以使用union的唯一明智之处是将所有标志设置为0(_flags = 0),或将所有标志设置为1(_flags = -1)。 / p>

  

删除或添加结构意味着我必须对触及联盟中任何其他成员的代码进行相应的更改吗?

是的,除非代码平等地触及所有成员,例如上面的两个例子。

答案 1 :(得分:1)

没有什么特别之处。这只是一个整数变量和一个带有位字段的结构的联合。

结构中的每个位域都是一位长度,因此它可用于访问整数中的各个位。