在我正在工作的一个类中,我在头文件中找到了类似的东西:
// 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?删除或添加到结构意味着我必须对涉及联盟中任何其他成员的代码进行相应的更改?
C++中不允许使用匿名成员结构(类),因此就标准而言,程序是不正确的.
访问union的非活动成员具有未定义的行为.
简而言之:无论它做什么都取决于编译器.
这两个都被允许在C中(前者不允许直到C11,后者直到C99),并且由一些编译器,作为C++中的扩展(以及作为C的早期版本中的扩展).我们假设你使用这样的编译器.
例如,设置是否
_flags = 3
意味着_fVar
1并且_fVar2
将为1_fVar3
并且_fVar4
将为0?
这可能是意图.但是,行为取决于编译器为位字段选择的表示形式.
在不对表示进行假设的情况下,可以使用union的唯一明智之处是将所有标志设置为0(_flags = 0
),或将所有标志设置为1(_flags = -1
).
删除或添加到结构意味着我必须对涉及联盟中任何其他成员的代码进行相应的更改?
是的,除非代码平等地触及所有成员,例如上面的两个例子.