我正在查看 pic 10 包含文件 (p32mk1024gpk064.h),并且想知道为什么他们添加了一个具有单个元素的结构,而不是结构和 uint_32 之间的并集。
typedef union {
struct {
uint32_t RB0:1;
uint32_t RB1:1;
uint32_t RB2:1;
uint32_t RB3:1;
uint32_t RB4:1;
uint32_t RB5:1;
uint32_t RB6:1;
uint32_t RB7:1;
uint32_t RB8:1;
uint32_t RB9:1;
uint32_t RB10:1;
uint32_t RB11:1;
uint32_t RB12:1;
uint32_t RB13:1;
uint32_t RB14:1;
uint32_t RB15:1;
};
struct {
uint32_t w:32;
};
} __PORTBbits_t;
VS
typedef union {
struct {
uint32_t RB0:1;
uint32_t RB1:1;
uint32_t RB2:1;
uint32_t RB3:1;
uint32_t RB4:1;
uint32_t RB5:1;
uint32_t RB6:1;
uint32_t RB7:1;
uint32_t RB8:1;
uint32_t RB9:1;
uint32_t RB10:1;
uint32_t RB11:1;
uint32_t RB12:1;
uint32_t RB13:1;
uint32_t RB14:1;
uint32_t RB15:1;
};
uint32_t w:32;
} __PORTBbits_t;
我尝试编译两个版本,它们都可以工作,我不知道第二个结构的意义是什么
在之前(C11 之前),这些数据类型都无效。结构或联合中的每个字段都需要一个名称。如果我们采用您的第一个示例,并将其缩减为第一个结构中的一位,您将拥有:
typedef union {
struct {
uint32_t RB0:1;
};
struct {
uint32_t w:32;
};
} __PORTBbits_t;
两个
struct
都没有给出名称,这是无效的。你需要有类似的东西:
typedef union {
struct {
uint32_t RB0:1;
} bits;
struct {
uint32_t w:32;
} word;
} __PORTBbits_t;
您可以访问以下内容:
__PORTBbits_t foo;
uint32_t bar = foo.word.w; // Ignore all the UB for uninitialised variables
uint32_t bit = foo.bits.RB0;
C11 允许匿名结构,只要字段都是唯一的。这可以让您跳过命名内部结构。在这种情况下,您的两个示例都是有效的,您可以像这样访问它们:
__PORTBbits_t foo;
uint32_t bar = foo.w;
uint32_t baz = foo.RB0;
由于这两个示例都使用了此“功能”,因此没有理由选择其中一个而不是另一个,它们的行为完全相同。