struct1 中以这种方式声明的成员称为“位域”。顾名思义,这些成员在内存中只占用几个位长度。它们实际占用的位数和可以占用的位数分别取决于“:”后面的数字和 ABI。
所以,
struct bits_A {
int a:10;
};
“a”是一个 10 位长度的成员。
尽管,
struct bits_B {
int a:64;
};
x86_64-unknown-linux-gnu-gcc linux编译工具无法成功编译(错误“错误:'a'的宽度超出其类型”),因为在x86_64中,位域长度只能等于或更小超过 32。
“位域”是 c 编程语言中非常难的部分,因为位域实现与编译工具、ABI 和 Endian 不同。
所以,
struct1 是一个包含两个成员的结构:1 位长度成员“a”和 2 位长度成员“b”。":0" 是一个长度为 0 的位字段,表示编译工具不会在同一个 int 中将 "a" 与 "b" 合并,因此它不是真正的成员。
根据1,长度为0的位域只是一个标志,指示编译工具不将“a”与“b”合并到同一个int中。更准确的解释是什么是零宽度位字段。
在 struct{ int a;int b;}struct1; 中,“struct1”是一个变量。而关键字“typedef”只定义了一种新类型。
struct1 中只有两个成员,请参见 No.2。