当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《在这种情况下,C++中的union会做什么?》经验,为你挑选了1个好方法。

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

// 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?删除或添加到结构意味着我必须对涉及联盟中任何其他成员的代码进行相应的更改?



1> eerorika..:

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

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

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


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

例如,设置是否_flags = 3意味着_fVar1并且_fVar2将为1 _fVar3并且_fVar4将为0?

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

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

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

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


@tuzzer正确.联合的使用需要对实现细节进行假设.
推荐阅读
小色米虫_524
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有