仅包含一个结构的联合
union containing only one struct
我今天开始在 PIC16f88 上编程,发现其寄存器的 header 包含一个 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
包含在 仅 包含 struct
的 union
中是否有任何好处?
我猜它的访问将与简单的 struct
完全相同(因为 struct
是匿名的):
ANSELbits.ANS4 = 0;
标准可移植 C 没有任何好处。
但是像这样的代码用于绕过(以不可移植的方式)您的 C 编译器将进行的所有类型检查。
然后您可以一次性设置底层 struct
的所有成员,这在这种情况下很有用,因为它包含很多位字段。
如果你换行并没有什么区别,我想有人忘记添加另一个成员(或者没有复制粘贴所有内容),如下面的声明。不会抑制任何警告。
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 类型。
我今天开始在 PIC16f88 上编程,发现其寄存器的 header 包含一个 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
包含在 仅 包含 struct
的 union
中是否有任何好处?
我猜它的访问将与简单的 struct
完全相同(因为 struct
是匿名的):
ANSELbits.ANS4 = 0;
标准可移植 C 没有任何好处。
但是像这样的代码用于绕过(以不可移植的方式)您的 C 编译器将进行的所有类型检查。
然后您可以一次性设置底层 struct
的所有成员,这在这种情况下很有用,因为它包含很多位字段。
如果你换行并没有什么区别,我想有人忘记添加另一个成员(或者没有复制粘贴所有内容),如下面的声明。不会抑制任何警告。
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 类型。