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

What does union in C++ do in this case?

在我工作的 classes 之一中,我在头文件中发现了这样的东西:

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

在class的一些成员函数中,我看到_flags_flags = 3;一样被直接设置。 我还看到直接设置结构中的成员,例如 _fVar1 = 0 并与之进行比较。

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

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

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

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

访问 non-active 联合成员具有未定义的行为。

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


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

For instance, does setting _flags = 3 means that _fVar1 and _fVar2 will be 1 and _fVar3 and _fVar4 will be 0?

大概就是这个意思。但是,行为取决于编译器为位字段选择的表示。

在不对表示做出假设的情况下,您可以使用联合的唯一明智的事情是将所有标志设置为 0 (_flags = 0),或将所有标志设置为 1 (_flags = -1) .

Would removing or adding to the struct means I have to make corresponding changes to codes that touches any of the other members in the union?

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