【问题标题】:Defining a bit, but without a name?有点定义,但没有名字?
【发布时间】:2013-08-09 16:30:43
【问题描述】:

所以我有一些代码用于我的板的iodefine。我在结构中看到了很多这些。它到底在做什么?它只是最后 4 位的占位符吗?为什么它不会导致编译器错误,它的用途是什么?

union {
    unsigned char BYTE;
    struct {
        unsigned char OVRF:1;
        unsigned char IDLNF:1;
        unsigned char MODF:1;
        unsigned char PERF:1;
        unsigned char :4;        <------------
    } BIT;
} SPSR;

我希望这不是太多问题,我只是觉得这很有趣。

【问题讨论】:

  • 看起来像未命名的填充。
  • 你应该有4而不是CHAR_BIT - 4 ...
  • @KerrekSB 我 100% 同意你的观点,但它是一个自动生成的文件,大约有 23k 行,所以我无能为力 =P。谢谢大家的回答。
  • 由于它与一个完整的 unsigned char 联合,我想这不是真的必要,但为了清楚起见......
  • @KerrekSB:鉴于此代码是针对一个非常特定的硬件量身定制的,该硬件包含一个带有溢出标志、空闲标志、模式故障标志和奇偶校验错误标志的串行外设状态寄存器,使用CHAR_BIT-4 不会完成任何事情。该程序不可移植,永远不会。

标签: c compiler-construction embedded


【解决方案1】:

这是一个未命名的位域。它用于提供填充(通常在相邻位域之间)。

(C99, 6.7.2.1p11) "没有声明符,只有冒号和宽度的位域声明,表示未命名的位域"

【讨论】:

    【解决方案2】:
    struct-declarator:
    declarator
    type-specifier declarator (opt) : constant-expression
    

    声明符是可选的,这就是编译器不会出错的原因。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-20
      • 1970-01-01
      • 1970-01-01
      • 2016-03-08
      相关资源
      最近更新 更多