结构声明

时间:2013-09-09 08:27:23

标签: c structure

有这样的结构声明:

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};这样的变量,它会给我错误“初始化程序太多”

2 个答案:

答案 0 :(得分:2)

这些称为位字段。这是一种指定应该为结构中的每个变量分配多少位的方法。

  1. 它们不是“两个字节”,代码中没有任何内容。宽度为1的有符号整数也是一个非常糟糕的主意,它只能存储值-1和0。
  2. 匿名位字段:0导致以下位字段被分配到不同的intSee this page了解详情。
  3. 是的,以上使用位字段,这将影响对ab的访问权限。
  4. 是的,结构中只有两个字段ab。不是三个。

答案 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不同。

所以,

  1. struct1是一个包含两个成员的结构:1位长度成员“a”和2位长度成员“b”。 “:0”是0长度位字段表示编译工具不在同一个int中将“a”与“b”合并,因此它不是真正的成员。

  2. 根据1,0长度位字段仅是表示编译工具不在同一int中将“a”与“b”合并的标志。更精确的解释是What is zero-width bit field

  3. 在struct {int a; int b;} struct1;中,“struct1”是一个变量。关键字“typedef”仅定义新类型。

  4. struct1中只有两个成员,请参见第2期。