这个C工会的成员有什么区别吗?

Is there any difference between the members of this C union?

下面的 typedef 适用于 Atmel SAMD21 ARM MCU 包含文件中的 DIR 寄存器。由于bit struct成员和reg成员都是32位的,那么这两个成员在union中有什么区别吗?

我试图理解为什么他们不只是使用 uint32_t 作为 DIRSET 寄存器的类型。我唯一的想法是他们只是以这种方式定义它,以便与位结构中有多个字段的其他寄存器保持一致。

typedef union {
    struct {
        uint32_t DIRSET:32;
    } bit;
    uint32_t reg;
} PORT_DIRSET_Type;

从一般的角度来看,这只是代码膨胀 - 您没有理由想要编写那样的代码。然而,ASF 编码风格是每个寄存器访问都以 .reg 结尾,所以这就是这里的原因:他们希望保持寄存器命名和使用一致。

他们当然可以用 typedef struct { uint32_t reg; } PORT_DIRSET_Type 做到这一点,但是这个代码库很少被合理地编写。它可能是通过一些脚本自动生成的。

根据经验,像这样的寄存器映射总是非常丑陋且不可移植,充满了不合理的代码。那些作为 ASF 的一部分发货的是我见过的所有类别中最糟糕的一些。