C位域/数组

标签 c bit-fields

我必须为学校做一个项目。但我一开始就卡住了。

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

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

但下一个任务是做一组宏来处理位域。其中之一是:

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

问题是我如何 typedef bitfield 以便以后可以更改其成员的数量?

我想到的第二种方法是使用 bool 数组。但同样,我怎样才能 typedef bool 数组?起初我试过:

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 命名标识符。

我希望我的帖子有意义,并感谢您提供的任何建议。

最佳答案

The question is how can I typedef bitfield so I could change number of its members later?

这就是 typedef struct ... BitArray 所做的。不需要额外的类型。

bool 数组很可能不会编译成按位代码,它可能会编译成字节数组,这不是您想要的。

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


一些建议:

I have to define type for bitfield

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

But next task is to do set of macros for working with bitfield

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

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

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

关于C位域/数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28985776/

相关文章:

c - 多核处理器中的线程

c++ - LLVM 无法从 IR 编译

c - 使用按位运算符在 C 中将颜色与位域混合?

强制转换为 union 字段会产生转换警告

c - 在 C 中重新定义寄存器位域的技巧

c - 如何管理 union 和位域

c - g++ 警告 sprintf 可能正在写入已被 malloc 的零长度字符串

ios - 将 UIImage 像素数据存储到 c 数组中,无法确定数组的元素计数

c - 有没有不支持任何形式的反射的主要编程语言?

c - 为什么打包不能跨同级 union 或结构工作