初始化匿名结构的位域

Nik*_*rin 3 c

我不确定这是否与编译相关,但我使用的编译器是IAR 7.10.3.

我有一个如下结构:

struct A {
  struct {
    uint8_t x:1;
    uint8_t y:2;
    uint8_t z:5;
  } b;
};
Run Code Online (Sandbox Code Playgroud)

并将其初始化为:

struct A a = {
  .b = 0xFF,
};
Run Code Online (Sandbox Code Playgroud)

现在,当我查看内存中的结构时,只有x位将设置为"1",其余的将为零.

这是根据C标准应该如何表现的吗?

oua*_*uah 6

struct A a = {
  .b = 0xFF,
};
Run Code Online (Sandbox Code Playgroud)

由编译器解析为

struct A a = {
  .b = {0xFF},
};
Run Code Online (Sandbox Code Playgroud)

这相当于

struct A a = {
  .b = {0xFF, 0, 0},
};
Run Code Online (Sandbox Code Playgroud)

使用:

struct A a = {
  .b = {1, 3, 31},
};
Run Code Online (Sandbox Code Playgroud)

将所有位字段设置为1.或者使用带有uint8_t和内部结构的联合并初始化第一个成员0xFF.