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

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

最佳答案

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

访问 union 体的非事件成员具有未定义的行为。

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


这两者在 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?

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

在不对表示做出假设的情况下,您可以使用 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/

相关文章:

c++ - 如何使 lambda 函数成为类的友元?

c++ - 为什么 C++ 不使用集中存储类型信息来实现高效的 RTTI?

c++ - 与位域的 union 为位域成员提供了意想不到的值(value)

c++ - 如何在命名 union 中使用构造函数?以及以后如何更改同一 union 实例中的值? C++/C++11

c - 使用 union 的名称访问 union 成员

c++ - 在 C++ 中设置 map 实现

多次调用函数中的c++大 vector

c++ - 如何从 lex/yacc 获取更多解析错误信息?

c++ - 将结构复制(使用赋值)到 union 内的结构导致段错误

C和 Bison : pointers to struct in %union definition