2011-01-28 18 views
8

Cuál es el significado del operador de dos puntos (:) en "uint isWidget: 1;" en Qt? Es "uint isWidget: 1;" equivalente a "uint isWidget (1)"?Cuál es el significado del operador de dos puntos (:) en "uint isWidget: 1;" en Qt?

El código en Qt es

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 
}; 
+0

Dado que son campos de bits como descritos en las respuestas a continuación, probablemente se estén utilizando como booleanos, pero con el compilador se les pidió específicamente que los empaquetaran todos en una palabra de 32 bits (tenga en cuenta 10 bits utilizados y 22 explícitamente sin usar). El compilador puede o no cumplir. Embalaje como este no es obligatorio para bool porque en la mayoría de las CPU es más lento operar en un solo bit (posiblemente involucrando valores de entrada y salida dentro y fuera), por lo que cada bool puede tener un carácter independiente o incluso una palabra .... –

+0

"¿Cuál es el significado de dos puntos (:) operador en" uint esWidget: 1; "en Qt?" debería ser Cuál es el significado del operador de dos puntos (:) en "uint isWidget: 1;" en C++? El lenguaje sigue siendo C++, Qt es solo un conjunto de bibliotecas :) –

+0

Comentario lateral: sería equivalente, si tal vez menos legible, si el último campo de bits 'int no utilizado: 22;' se deletreara como 'int: 22' (como siempre y cuando no esté en uso. Además, también sería equivalente si no estuviera presente por completo (el compilador no puede reutilizar esos 22 bits para contener parte del atributo 'postingEvents') –

Respuesta

13

Esto es parte de la notación C struct - se puede especificar el tamaño de un campo entero en bits utilizando una : numBits después de que el nombre de la propiedad.

Debo suponer que la misma sintaxis se puede utilizar en una clase de C++ (soy un tipo C, pero estoy seguro de que esto es hacer la misma cosa en C++)

+2

Es esencialmente lo mismo: las diferencias entre C y C++ son las que esperaría, p. los bitfields pueden ser privados en C++. – MSalters

+1

sí, también es válido C++ –

Cuestiones relacionadas