我正在阅读别人的代码我不明白为什么他在下面的每个联盟中引用的方式不同。
- 在第一个,他可以通过输入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;
答案 0 :(得分:2)
这是一个位域的例子 - 每个带有“:”的变量代表一个整数的特定位数。该位域是联合的,以允许根据上下文对相同的位位置进行不同的命名。
为了清楚起见,您可以访问一个工会成员,并表示您的代码的意图 - 这是通过创建有意义的名称而不是像“第4位”这样无意义的名称来自行记录代码的好方法。
重新阅读你的问题 - 两者之间的区别在于,一个使用命名结构而另一个不使用。在第一个中,可以访问结构的成员而不进行结构成员引用(“。”),因为它们没有名称。在第二个中,他声明了一个带有名称的结构,因此使用了结构成员引用。在我看来,第二个更清楚,但第一个更简洁。这是风格和偏好的问题。