C代码后变量名后的冒号

Eon*_*nil 22 c syntax bit-fields

可能重复:
'unsigned temp:3'表示什么

这是参考页面的C代码示例.

      signed int _exponent:8;
Run Code Online (Sandbox Code Playgroud)

在'8'和'8'之前结肠的含义是什么?

Ebo*_*ike 25

这是一个位域.它仅在struct定义中有效,这意味着系统将仅使用8位作为整数.


R..*_*R.. 17

它是一个位域,一个模糊和错误的结构特征.这应该足以让您查找需要知道的信息来处理其他人代码中的位域.至于你自己的代码,永远不要使用位域.

编辑:由Zack重新编写,与执行自己的位算术相比,位域有明显的缺点,没有任何优势.这里是其中的一些:

  • 您一次只能复制,比较,序列化或反序列化一个位域元素.做你自己的位算术,你可以一次操作整个单词.
  • 你永远不能有一个指向位域元素的指针.使用您自己的位算术,您可以将指向较大字的指针和字内的位索引作为"指针".
  • 只要你使用固定大小的类型并知道字节顺序,直接读/写C结构到磁盘或网络是没有位域的中途可移植.但是,抛出位域,并且即使在给定的cpu架构中,较大类型中的元素的顺序,以及使用的总空间和对齐也变得高度依赖于实现.
  • C规范有一些非常奇怪的规则,比允许位域元素的签名与你期望的不同,很少有人知道这些.

对于单比特标志,使用您自己的比特算术而不是位域是一个完全明智的选择.对于较大的值,您需要打包,如果在整个地方写出所有位算术太痛苦,请编写一些简单的宏.

  • 那是一个非常强烈的声明.注意详细说明? (2认同)
  • +1表示"从不使用位域". (2认同)
  • 不同意 :).我不同意"结构的模糊和错误的特征"和"从不使用位域"部分.比特字段对于空间的经济使用和与硬件的接口非常必要. (2认同)
  • @paxdiablo:我不认为位域是应该避免的强力工具,因为它们很危险。我认为它们因规范不足而瘫痪,这使得它们的使用不如进行位算术的简单替代方法有效。 (2认同)