我今天开始在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);
:
struct
将union
封装在仅{em> 包含struct
的{{1}}内是否有好处?
我想它的访问方式将与它是简单的struct
完全相同(因为struct
是匿名的):
ANSELbits.ANS4 = 0;
答案 0 :(得分:2)
标准便携式C没有任何好处。
但是像这样的代码用于规避(以非便携式的方式)C编译器将进行的所有类型检查。
然后您就可以一次设置基础offset2
的所有成员,这在这种情况下非常有用,因为它包含很多位字段。
答案 1 :(得分:2)
如果您换行,则没有任何区别,我想是有人放弃了添加另一个成员(或未复制粘贴所有内容),如下面的声明所示。没有警告将被禁止。
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);
顺便说一句,如果结构必须适合1个字节(8位),则此声明是错误的,应改用uint_t类型。