结构与一个元素的并集与元素并集 mplab pic32

问题描述 投票:0回答:1

我正在查看 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;

我尝试编译两个版本,它们都可以工作,我不知道第二个结构的意义是什么

c struct pic bit-fields mplab
1个回答
0
投票

在之前(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;

由于这两个示例都使用了此“功能”,因此没有理由选择其中一个而不是另一个,它们的行为完全相同。

© www.soinside.com 2019 - 2024. All rights reserved.