这是否会创建具有冒号后所写的相应大小的变量?

Does this creates variables with respective sizes as written after colon?

我第一次浏览一些涉及大量结构和枚举的代码。所以我在理解上面临一些问题。有一些使用 struct?

的寄存器初始化
struct register_name
{
uint32_t var1:10;
uint32_t var2:22;
};

它会创建 10 位和 22 位的 var1 和 var2 吗? (寄存器为32位)

编译器不会在内部创建两个大小为 10 和 22 的对象。它会在内部创建一个大小为 32 的对象并将其分成两部分,将它们解释为 var1 和 var2。

编译器提供了一种可能性,您可以通过它来控制内部创建的对象数量。

考虑以下演示程序。

#include <stdio.h>
#include <stdint.h>

struct A
{
    uint32_t var1:10;
    uint32_t var2:22;
};

struct B
{
    uint32_t var1:10;
    uint32_t : 0;
    uint32_t var2:22;
};

int main(void) 
{
    printf( "sizeof( struct A ) = %zu\n", sizeof( struct A ) );
    printf( "sizeof( struct B ) = %zu\n", sizeof( struct B ) );
    return 0;
}

它的输出是

sizeof( struct A ) = 4
sizeof( struct B ) = 8

在结构 B 的情况下,每个变量 var1var2 作为一部分包含在其大小等于 32 的内部对象中。

逻辑上var1var2确实对应占用了10位和22位。编译器在幕后完成所有工作。