我想在一个位打包的结构中有一个数组。我静态地知道数组的大小(32),我希望数组中的每个元素都是一个位。例如,我希望能够说出类似的内容:
struct example_s {
// ...
unsigned int flags[32] : 32;
} __attribute__((__packed__));
我尝试了几件事,但gcc不会让步。能够这样做是很好的,这样我就可以编写遍历打包数组中元素的干净代码。想法?
答案 0 :(得分:7)
如果你只是把它放到一个(32位)int中,那么你可以用这样的for循环干净地迭代这些位:
for (bit = 0; bit < 32; bit++)
flagValue = ((flags & (1<<bit)) != 0;
写入数据索引语法并不困难。
如果您希望隐藏位错误以使代码更具可读性,您甚至可以使用函数或宏来访问位 - 例如GetFlag(bit)
答案 1 :(得分:1)
Bitfield成员元素没有地址,因此即使您可以声明它们的数组,也无法使用它(C中的所有数组访问都是指针算术和解除引用)。使用更大类型的位来编写自己的位数组很容易;杰森解释了基础知识。一般来说,除非你有充分的理由,否则你应该避免使用位域。他们通常比他们的价值更麻烦。