C语言中变量名后面的冒号

32

3
这是结构体定义的一部分吗? - Mark Elliot
4个回答

37

这是一个位域(bitfield)。它只在struct定义中有效,意味着系统将只使用8位来表示您的整数。


17

这是一个位域(bitfield),结构体的一个不太常用的和误导人的特性。这应该足够让您查找需要了解如何处理其他人代码中的位域的信息。至于您自己的代码,永远不要使用位域。

编辑:根据Zack的要求,位域与执行自己的位运算相比具有显着的劣势,而且没有优势。以下是一些缺点:

  • 您只能一次复制、比较、序列化或反序列化一个位域元素。如果进行自己的位运算,可以一次处理整个字。
  • 您永远无法拥有指向位域元素的指针。使用自己的位运算,您可以拥有指向更大的单词和单词内的位索引的指针。
  • 如果没有使用位域,直接将C结构读取/写入磁盘或网络会半数可移植,只要使用固定大小的类型并知道字节顺序即可。但是加入位域后,元素在更大类型内的顺序、总空间使用和对齐方式变得高度依赖于实现,即使在给定的CPU架构中也是如此。
  • C规范有非常奇怪的规则,允许位域元素的符号与您预期的不同,很少有人知道这些规则。

对于单个比特标志,使用自己的位运算而不是位域是一个完全没有头脑的选择。对于需要打包的较大值,如果在各处都写出所有位运算太麻烦,可以编写一些简单的宏。


2
这是一个非常有力的陈述。你能详细说明一下吗? - zwol
5
+1 表示“永远不要使用位域(bitfields)”。我会尽力润��翻译,使其更加通俗易懂,但不会改变原意。请告诉我您需要翻译的其他内容。 - Travis Gockel
4
不同意:)。我不同意“结构体的晦涩和误导性特征”以及“永远不要使用位域”的说法。位域非常必要,可以经济地利用空间,并与硬件进行接口交互。 - Arun
1
“晦涩和误导性”?那可真是狠话!位域有其用处,就像goto语句和多个返回点一样。例如,在嵌入式系统中,它们可以非常宝贵,以避免手动位操作。我不会因为我的建筑工人岳父使用电动工具而责备他,因为我假设他知道如何处理它们。所有工具,包括编程语言,都一样。 - paxdiablo
3
@paxdiablo:我不认为位域是应该避免使用的强大工具,因为它们很危险。我认为它们由于规范不足而变得不如简单的位运算那样有效。 - R.. GitHub STOP HELPING ICE
显示剩余5条评论

4

这是一个位域规范。

它意味着_exponent只取signed int中的8位,而signed int通常不止8位。通常,位域与无符号类型一起使用。

如果写入_exponent的内容超过8位,编译器会发出警告。


2
当该语句位于一个结构体内时,表示位域。请参考位域相关资料。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接