在我工作的其中一个类中,我在头文件中发现了类似这样的内容:
// 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?删除或添加到结构是否意味着我必须对涉及 union 中任何其他成员的代码进行相应的更改?
最佳答案
C++ 中不允许使用匿名成员结构(类),因此就标准而言,该程序是病式的。
访问 union 体的非事件成员具有未定义的行为。
简而言之:无论它做什么都取决于编译器。
这两者在 C 中都是允许的(前者直到 C11 才被允许,后者直到 C99 才被允许),并且一些编译器将其作为 C++ 中的扩展(以及作为早期版本的 C 中的扩展)。让我们假设您使用这样的编译器。
For instance, does setting
_flags = 3
means that_fVar
1 and_fVar2
will be 1 and_fVar3
and_fVar4
will be 0?
这可能是意图。但是,行为取决于编译器为位字段选择的表示。
在不对表示做出假设的情况下,您可以使用 union 的唯一明智的事情是将所有标志设置为 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?
是的,除非代码平等地触及所有成员,如上面的两个示例。
关于c++ - 在这种情况下,C++ 中的 union 做了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41643245/