有这样的结构声明:
typedef struct {
int a:1;
:0;
int b:2;
} struct1;
我不明白如何阅读或理解它,我不明白以下内容:
1)struct1
是一个包含整数a
的数据类型,两个字节的b分别只能访问1和2位,
2):0
是什么意思?
3)struct{ int a;int b;}struct1;
与上述typedef
之间是否存在差异?
4)如果我创建一个像struct1 c={1,2,4};
这样的变量,它会给我错误“初始化程序太多”
答案 0 :(得分:2)
这些称为位字段。这是一种指定应该为结构中的每个变量分配多少位的方法。
:0
导致以下位字段被分配到不同的int
。 See this page了解详情。a
和b
的访问权限。a
和b
。不是三个。答案 1 :(得分:0)
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长度位字段仅是表示编译工具不在同一int中将“a”与“b”合并的标志。更精确的解释是What is zero-width bit field。
在struct {int a; int b;} struct1;中,“struct1”是一个变量。关键字“typedef”仅定义新类型。
struct1中只有两个成员,请参见第2期。