Q我遇到了一些带有冒号和数字的结构声明,数字紧跟在某些字段旁边,像这样:
struct record { char *name; int refcount : 4; unsigned dirty : 1; };这是怎么回事?
A那些是 位域;数字表示该字段的确切大小,以位为单位。(更多详情请参阅任何关于 C 的完整书籍。)位域可用于节省结构体的空间,当结构体包含多个二进制标志或其他小型字段时,它们也可以用于尝试符合外部强加的存储布局。(在后一种任务上的成功受到位域在某些机器上从左到右分配,而在其他机器上从右到左分配的事实的影响。)
请注意,用于指定字段大小(以位为单位)的冒号表示法仅在结构体(以及联合体)中有效;您不能使用此机制来指定任意变量的大小。(请参阅问题 1.2 和 1.3。)
参考文献:K&R1 第 6.7 节 pp. 136-8
K&R2 第 6.9 节 pp. 149-50
ISO 第 6.5.2.1 节
H&S 第 5.6.5 节 pp. 136-8