C位字段/数组

时间:2015-03-11 11:44:43

标签: c bit-fields

我必须为学校做一个项目。但是我一开始就陷入困境。

我必须为bitfield定义类型。这不是问题,它看起来像这样:

typedef struct {
   unsigned flag1 : 1;
   unsigned flag2 : 1;
}BitArray;

但接下来的任务是使用一组宏来处理bitfield。其中之一是:

create(field_name,size) /* defines and initializes bitfield */

问题是如何键入dede bitfield以便稍后更改其成员数量?

我想到的第二种方法是使用bool数组。但同样,我怎么能输入bode数组呢?我试着说:

typedef bool BitArray[]; //new identifier BitArray for bool array
BitArray Array[5];      //new BitArray variable Array - this line would be in the macro mentioned above

我没有花很长时间才意识到它不起作用。但是我能做到:

typedef bool BitArray;
BitArray Array[5];

但它只是bool的ranames标识符。

我希望我的帖子有道理并感谢您提出的任何建议。

2 个答案:

答案 0 :(得分:2)

  

问题是如何键入dede bitfield以便稍后更改其成员数量?

这是typedef struct ... BitArray的作用。无需其他类型。

bool数组很可能无法编译成逐位代码,它可能会编译成一个字节数组,这不是你想要的。

另外,隐藏在typedef后面的数组或指针是一个非常糟糕的主意,这样它们就不再像数组或指针一样。


一些建议:

  

我必须为bitfield定义类型

I would not recommend to use bit fields for any purpose what-so-ever。您应该质疑您的老师为什么他们教您使用C语言中危险且指定不当的部分。

  

但接下来的任务是使用一组宏来处理位域

你应该问你的老师他们为什么教你使用类似函数的宏而不是正确的函数。使用类似函数的宏可能是你在C中做的最糟糕的事情:它们很危险,它们不可读,它们很难调试,很难维护。

将类似函数的宏与位域混合在一起似乎是真正的愚蠢的想法,但当然这只是我个人的观点。安全且100%可移植的方法是在字节级变量上使用带位掩码的逐位运算符,例如:

uint8_t my_var=0;
my_var |= 0x80; // set msb, bit 7
my_var &= ~0x80; // clear msb, bit 7

答案 1 :(得分:1)

在C语言中,您只能为固定大小的数组声明typedef,如下所示:

typedef bool bitset8[8]; // 8 is constant expression
bitset8 bs8;
bs8[0] = true;

我不太明白你的文章中将如何使用create宏,但如果你需要动态更改字段数,你必须使用malloc'ed对象 ANYWAY ,所以BitArray struct的声明应该包含一个指向let {s} unsigned char的指针(实际上是指向字节数组的指针)。数组的内容应该由单独的函数管理,这些函数可以从宏调用(虽然它们没有真正的需要)。