c - 结构并以两种不同的方式引用它们

标签 c struct unions

我正在阅读某人的代码,我不明白为什么他在下面的每个 union 内引用不同。

-在第一个上,他可以通过键入 pwr_cmd.EN1 来引用内部 - 在第二个上,他可以通过键入 errors.Bits.ERR1 来引用内部 - 如果我从第二个中删除 Bits,我是否能够像第一个一样在内部引用:errors.ERR1? - 两者之间有什么区别,为什么要先做一个再做另一个?谢谢。

typedef union {
    byte Byte;
    union {
        struct {
            byte EN1 :1;
            byte EN2 :1;
            byte EN3 :1;
            byte EN4 :1;
            byte :4;
        };
        struct {
            byte :2;
            byte EN34 :2;
            byte :4;
        };
        struct {
            byte :2;
            byte EN3r:1;
            byte EN4r:1;
            byte :4;
        };

    };
} pwr_cmd;



typedef union {
    word Word;
    union {
        struct {
            byte ERR1 :1;
            byte ERR2 :1;
            byte ERR3 :1;
            byte ERR4 :1;
            byte ERR5 :1;
            byte ERR6 :1;
            byte ERR7 :1;
            byte ERR8 :1;
            byte ERR9 :1;
            byte DET1 :1;
            byte DET2 :1;
            byte FAIL1 :1;
            byte PWR1 :1;
            byte PWR2 :1;
            byte PWR3 :1;
            byte PWR4 :1;
        } Bits;
            nibble4 Nibble4;
    };
} errors;

最佳答案

这是一个位域的例子——每个带有“:”的变量代表一个整数的特定位数。该位域被并集化,以允许根据上下文对相同的位位置进行不同的命名。

为了清晰起见,您可以访问一个 union 成员而不是另一个成员,并表示您的代码的意图 - 这是一种 self 记录代码的好方法,方法是创建有意义的名称而不是像“位 4”这样无意义的名称。

重新阅读您的问题 - 两者之间的区别在于一个使用命名结构而另一个不使用。在第一种情况下,无需执行结构成员引用 (".") 即可访问结构成员,因为它们没有名称。在第二个中,他声明了一个带有名称的结构,因此使用了结构成员引用。在我看来,第二个更清晰,但第一个更简洁。这是风格和偏好的问题。

关于c - 结构并以两种不同的方式引用它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4536838/

相关文章:

c - C语言简单的HTTP请求和响应

c - 使用 read() 系统调用反转文件中的每一行

c - 将字符串文件读取到字符串数组

json - 使用 GO 返回一个结构数组作为 Json 响应

json - 在 Codable - Swift 中使用 "/"和 "%"

c - const-casting 是通过 union 未定义的行为吗?

c - fread 返回 0 并且无法在 Windows 计算机上打开 db 文件。找不到文件吗?或者是权限?

c++ - 联盟的内存映射

c - 错误: incompatible types in assignment of unions

c++ - 在 C 和 C++ 中通过指针访问结构