2011-01-28 3 views
8

Qual è il significato dell'operatore colon (:) in "uint isWidget: 1;" a Qt? "Uint èWidget: 1;" equivalente a "uint isWidget (1)"?Qual è il significato dell'operatore colon (:) in "uint isWidget: 1;" a Qt?

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

Dato che sono campi di bit come descritti nelle risposte qui sotto, sono probabilmente usati come booleani, ma con il compilatore specificamente richiesto di comprimerli tutti in una parola a 32 bit (nota 10 bit usati e 22 esplicitamente inutilizzati). Il compilatore potrebbe o potrebbe non essere conforme. Il confezionamento di questo tipo non è obbligatorio per il bool perché sulla maggior parte delle CPU è più lento operare su un singolo bit (possibilmente coinvolgendo i valori di & -ing e | -ing in/out), quindi ogni bool potrebbe essere un dato char indipendente o addirittura una parola .... –

+0

"Qual è il significato dell'operatore colon (:) in" uint isWidget: 1; "in Qt?" dovrebbe essere Qual è il significato dell'operatore colon (:) in "uint isWidget: 1;" in C++? Il linguaggio è ancora C++, Qt è solo un insieme di librerie :) –

+0

Commento laterale: sarebbe equivalente, se forse meno leggibile, se l'ultimo bitfield 'int inutilizzato: 22;' è stato scritto come 'int: 22' (come Inoltre, sarebbe anche equivalente se non fosse presente del tutto (il compilatore non può riutilizzare quei 22 bit per mantenere una parte dell'attributo 'postedEvents') –

risposta

13

Questo fa parte del C struct notazione - è possibile specificare le dimensioni di un campo intero in bit utilizzando una : numBits dopo il nome della proprietà.

devo supporre che la stessa sintassi può essere utilizzato in una classe C++ (io sono un ragazzo C, ma sono sicuro che questo sta facendo la stessa cosa in C++)

+2

È essenzialmente la stessa cosa: le differenze tra C e C++ sono quelle che ci si aspetterebbe, ad es. i bitfield possono essere privati ​​in C++. – MSalters

+1

sì è valido anche il C++ –

Problemi correlati