我希望在一个位压缩的结构体中有一个数组。我静态地知道数组的大小(32),我希望数组中的每个元素都是一个单独的位。例如,我希望能够这样说:
struct example_s {
// ...
unsigned int flags[32] : 32;
} __attribute__((__packed__));
我尝试了几个方法,但gcc不会让步。如果能够这样做,那将很好,因为我可以编写干净的代码来迭代打包数组中的元素。有什么想法吗?
我希望在一个位压缩的结构体中有一个数组。我静态地知道数组的大小(32),我希望数组中的每个元素都是一个单独的位。例如,我希望能够这样说:
struct example_s {
// ...
unsigned int flags[32] : 32;
} __attribute__((__packed__));
我尝试了几个方法,但gcc不会让步。如果能够这样做,那将很好,因为我可以编写干净的代码来迭代打包数组中的元素。有什么想法吗?
如果你只是将它放入(32位)整数中,那么你可以通过for循环清晰地迭代这些位,就像这样:
for (bit = 0; bit < 32; bit++)
flagValue = ((flags & (1<<bit)) != 0;
这段代码的难度不比数组索引语法高。
如果您希望隐藏位操作以使代码更易读,甚至可以使用函数或宏来访问位 - 例如,GetFlag(bit)
。
位域成员元素没有地址,因此即使您可以声明它们的数组,也无法使用它(在C中,所有数组访问都是指针算术和解引用)。不过,使用较大类型的位来编写自己的位数组很容易;Jason已经解释了基础知识。通常情况下,除非您有非常好的理由,否则应避免使用位域。它们通常会带来更多麻烦。
struct foo
有一个成员char bar[10]
,那么foo.bar
是一个表达式,其评估为类型char *
,并且foo.bar[2]
被评估为*(foo.bar+2)
,从而使其正常工作。数组语法a[b]
只是*(a+b)
的语法糖(和方便的无需括号的分组)。 - R.. GitHub STOP HELPING ICE[]
运算符的定义方式。而.
运算符并非如此,这就是为什么不会出现相同的问题的原因。 - caf