3

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;
4

2 回答 2

7

它被称为未命名位域。C11 标准说明了它和可能的用法:

6.7.2.1 结构和联合说明符

没有声明符但只有冒号和宽度的位域声明表示未命名的位域。106) 作为一种特殊情况,宽度为 0 的位域结构成员表示不再将位域打包到放置前一个位域(如果有的话)的单元中。

106) 一个未命名的位域结构成员可用于填充以符合外部强加的布局。

于 2013-05-30T10:42:45.420 回答
0

出于多种原因,可以使用这样的未命名位域。如前所述,一个原因是为了填充其他值以匹配存在未使用值的外部布局。我已经看到它使用这种方式直接映射到硬件上。

它们也可以不命名以备将来扩展

尽管您可以给出一个名称来表明它未使用,但有人可以使用您提供的字段设置这些位,并且通过不命名它,您可以让用户跳过箍以设置这些位。您最终还会以unnamed1等方式unnamed2分散您的位域

例如,在我使用的微处理器上,有一些位是专门供调试器使用的,并且不命名它们会使开发人员难以无意中设置它们。

问题出在以前的版本上,他们被命名并且一位同事使用了它们。更新编译器和头文件,不再构建代码

于 2013-05-30T10:51:47.330 回答