我今天开始在PIC16f88上编程,发现其寄存器的标题包含一个union只包含一个struct:
extern volatile unsigned char ANSEL __at(0x09B);
typedef union {
struct {
unsigned ANS0 :1;
unsigned ANS1 :1;
unsigned ANS2 :1;
unsigned ANS3 :1;
unsigned ANS4 :1;
unsigned ANS5 :1;
unsigned ANS6 :1;
};
} ANSELbits_t;
extern volatile ANSELbits_t ANSELbits __at(0x09B);
Run Code Online (Sandbox Code Playgroud)
它是否提供任何好处,以封闭struct内union即只包含struct?
它的访问量我想是完全相同的,因为它是一个简单的struct(因为它struct是匿名的):
ANSELbits.ANS4 = 0;
如果您换行并且我认为有人忘记添加另一个成员(或者没有复制粘贴所有内容),则没有任何区别,如下面的声明所示。不会抑制任何警告。
typedef union {
struct {
unsigned ANS0 :1;
unsigned ANS1 :1;
unsigned ANS2 :1;
unsigned ANS3 :1;
unsigned ANS4 :1;
unsigned ANS5 :1;
unsigned ANS6 :1;
};
uint8_t d8;
} ANSELbits_t;
extern volatile ANSELbits_t ANSELbits __at(0x09B);
Run Code Online (Sandbox Code Playgroud)
顺便说一句,如果结构必须适合 1 个字节(8 位),则此声明是错误的,应使用 uint_t 类型。