【问题标题】:Bitfields in C without variable nameC中没有变量名的位域
【发布时间】:2023-03-06 17:52:01
【问题描述】:

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;

【问题讨论】:

  • 在开头保留八位以供将来扩展?你真的要问作者为什么把它放在那里,我们所能做的就是推测。

标签: c bit-fields


【解决方案1】:

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

6.7.2.1 结构和联合说明符

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

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

【讨论】:

  • 那么如果有 8 个命名位域变量(foo[0-7]:1),这意味着它们分配了 8 个(未命名)+ 8(8 个命名位域)位内存?
  • 是的。基本上是在开始时分配(或保留)的额外位。
【解决方案2】:

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

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

虽然您可以给出一个名称来表明它是未使用的,但有人可以使用您提供的字段来设置这些位,并且不命名它会使用户跳过箍来设置这些位。你最终也会得到unnamed1unnamed2 等分散你的位域

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-22
    • 1970-01-01
    • 2021-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多