在Qt中,"uint isWidget : 1;"中的冒号(:)运算符的含义是什么?

11

在Qt中,“uint isWidget : 1;”中的冒号(:)运算符的含义是什么?它等同于“uint isWidget(1)”吗?

Qt中的代码为:

QObjectData 
{
  public:
     virtual ~QObjectData() = 0;
     QObject *q_ptr;
     QObject *parent;
     QObjectList children;

     uint isWidget : 1;
     uint pendTimer : 1;
     uint blockSig : 1;
     uint wasDeleted : 1;
     uint ownObjectName : 1;
     uint sendChildEvents : 1;
     uint receiveChildEvents : 1;
     uint inEventHandler : 1;
     uint inThreadChangeEvent : 1;
     uint hasGuards : 1; //true iff there is one or more QPointer attached to this object
     uint unused : 22;
     int postedEvents;
     QMetaObject *metaObject; // assert dynamic 
};

在C++中,“uint isWidget : 1;” 中的冒号(:)运算符的含义是什么?Qt只是一组库,语言仍然是C++ :) - Frank Osterfeld
旁注:如果最后一个位域 int unused : 22; 被拼写为 int : 22(只要它确实未使用),那么它将是等效的,尽管可能不太可读。此外,如果它根本不存在(编译器无法重用这些22位来保存 postedEvents 属性的一部分),也是等效的。 - David Rodríguez - dribeas
@David,Tony的意思是,如果你写成bool foo; bool bar,这可能会占用16位甚至64位,但如果你使用位域表示法,就不会了。也就是说,这是使用位域而不是布尔值的动机。 - tobyodavies
@David:从9.6.1开始,“类对象内位域的分配是实现定义的。位域的对齐方式也是实现定义的。”这种表示法允许程序员确定字段的大小,而不一定是布局。当然,你所说的布局兼容性非常重要,在实践中,编译器往往会像对待char、int和其他字段一样简单可预测。 - Tony Delroy
@David:顺便说一下,“int: 0”可能已经足够让编译器跳到下一个二进制单词了——程序员没有必要自己计算和硬编码22(除非他们实际上想要将下一个字段对齐在32字节的二进制上,即使字长不同)。 - Tony Delroy
显示剩余2条评论
1个回答

15

这是 C 中 struct 符号的一部分 - 你可以在属性名后使用 : numBits 来指定整数字段的位数大小。

我必须假设同样的语法可以在 C++ 类中使用(我是个 C 程序员,但我确信在 C++ 中这也是同样的事情)。


2
基本上是一样的 - C 和 C++ 之间的区别就像你所期望的那样,例如在 C++ 中位域可以是私有的。 - MSalters

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