结构中联合的位字段

ins*_*nce 2 c bit-fields

我有这两种结构: - 1.

typedef struct bitfield
{
    unsigned int a:16;
    unsigned int b:17;
    union
    {    
        unsigned int c:4;
        unsigned int d:32;
    };
}bfield;
Run Code Online (Sandbox Code Playgroud)

这个结构有匿名联合,当我计算这个结构的大小时 - 它出来是12个字节(4 + 4 + 4).这可以.

2.

typedef struct bitfield
{
    unsigned int a:16;
    unsigned int b:17;
    union u
    {    
        unsigned int c:4;
        unsigned int d:32;
    };
}bfield;
Run Code Online (Sandbox Code Playgroud)

但我在32位机器上的DevC++编译器为这个结构的大小打印了8个字节.我不明白为什么它会出现8.

ens*_*nsc 5

您的第一个示例声明了一个匿名结构union.

第二个例子声明了一个包含声明的结构union,这是一个noop.例如

typedef struct bitfield
{
    unsigned int a:16;
    unsigned int b:17;
    union u
    {    
        unsigned int c:4;
        unsigned int d:32;
    };
}bfield;

int main(void) {
    struct bitfield b;
    b.c=2;
}
Run Code Online (Sandbox Code Playgroud)

会失败的

x.c:14:4: error: 'struct bitfield' has no member named 'c'
Run Code Online (Sandbox Code Playgroud)

编译器可能会警告它

x.c:9:6: warning: declaration does not declare anything
Run Code Online (Sandbox Code Playgroud)

所以,你的问题与bitfields没什么关系,但与匿名联盟.

  • ...然后继续,你可能意味着把'u`放在块之后,而不是之前,所以你得到了'union {uint c; uint d} u` (2认同)