C中未命名的位字段有什么用?
示例:
typedef struct fun {
unsigned int :8;
unsigned int foo1 :1;
unsigned int foo2 :1;
unsigned int foo3 :1;
unsigned int foo4 :1;
unsigned int foo5 :1;
}dig;
行的用途是什么:
unsigned int :8;
答案 0 :(得分:5)
它被称为未命名的位字段。 C11标准陈述了它和可能的用法:
6.7.2.1结构和联合规范
没有声明者但只有冒号的位字段声明 宽度表示未命名的位字段。 106)作为一个特殊的 例如,宽度为0的位字段结构成员表示没有 进一步的比特字段将被打包到前一个单元中 比特菲尔德,如果有的话,被安置。
106)一个未命名的位字段结构成员是有用的 填充以符合外部施加的布局。
答案 1 :(得分:0)
出于多种原因,可以使用这样的无状态位域。已经提到的一个原因是为了匹配具有未使用值的外部布局而填充其他值。我已经看到它用这种方式直接映射到硬件上。
他们也可能未被命名为未来扩展
虽然您可以给出一个名称来表明它未被使用,但是有人可以使用您提供的字段设置这些位,并且不指定它,您可以让用户跳过箍以设置位。您最终还会使用unnamed1
,unnamed2
等分散您的位域
例如,在我使用的微处理器上,有一些专门用于调试器的位,并且没有命名它们会使开发人员更难以无意地设置它们。
问题在于他们被命名的先前版本以及同事使用它们。更新编译器和头文件,不再构建代码