【问题标题】:Can or should I make bools bit fields?我可以或应该制作布尔位字段吗?
【发布时间】:2021-09-07 11:15:46
【问题描述】:

这是合法的还是推荐的?我读到你应该只使用整数类型作为位域,但这适用于布尔类型吗?这可以吗,或者这是不好的做法或未定义的行为?

struct MyStruct {
    // ...
    bool SomeBooleanProperty:1;
    // ...
};

【问题讨论】:

  • 没关系,因为 bool 可以有两个完全适合 1 位位域的整数值
  • bool 是整数类型。
  • 拥有bool 类型的位域是完全可以的,这在C17 标准6.7.2.1 (5) 中有明确规定(注意_Boolbool 相同)。
  • 虽然听说boolunsigned char有细微的差别
  • 就可取性而言,它受制于一般使用位域的所有相同优点和缺点,这在其他地方进行了令人作呕的讨论,例如stackoverflow.com/questions/24933242/…

标签: c struct boolean bit-fields


【解决方案1】:

可以...我制作 bools 位字段吗?

是的。它是 3 个定义明确的选择之一。

位域的类型应为_Boolsigned intunsigned int 或其他一些实现定义的类型的合格或非合格版本。是否允许原子类型是实现定义的。 C17dr § 6.7.2.1 5


....我应该制作 bools 位字段吗?

是的,如果它使代码更清晰。

注意:这是一个不使用int x:1 的地方,因为如果x 具有值[0,1] 或[-1,0],则它是实现定义的。将signed int x:1unsigned x:1_Bool x:1 分别用于[-1,0]、[0,1]、[0,1]。

对于x:1bool 在分配超出范围的值时确实比signed int 具有更清晰的功能规范。见comment。对于unsigned,仅复制 LSbit。

【讨论】:

  • 请注意 _Bool 和 int 版本的行为不同,例如x = 2; 将产生一个真正的 _Bool 但其他类型为零
  • @M.M 同意 boolunsinged 为零。 signed int 可能为零 - 但这是实现定义的转换。这一点确实给了bool 一个优势。
猜你喜欢
  • 1970-01-01
  • 2010-10-05
  • 1970-01-01
  • 2014-08-27
  • 1970-01-01
  • 2020-07-29
  • 2020-10-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多