C中变量名后的冒号[重复]

问题描述 投票:20回答:4

可能重复: What does a colon in a struct declaration mean, such as :1, :7, :16, or :32?

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

      signed int _exponent:8;

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

c syntax bit-fields
4个回答
24
投票

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


17
投票

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

编辑:根据Zack的要求,位字段与执行自己的位算术相比具有明显的缺点,没有任何优势。这里是其中的一些:

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

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


3
投票

这是bitfield规范。

这意味着_exponent仅从8中获取signed int位,这通常需要超过8位。通常,位字段与无符号类型一起使用。

IIRC,如果一个不适合8位的东西写入_exponent,编译器会发出警告。


2
投票

当该陈述在结构内时,意味着bit fields

© www.soinside.com 2019 - 2024. All rights reserved.