Come per lo standard C ++ n4713 , viene fornito uno snippet di codice molto simile. Il tipo utilizzato è BOOL
(personalizzato), ma può essere applicato a qualsiasi tipo.
12.2.4
4 Se il valore vero o falso è memorizzato in un campo di bitbool
di qualsiasi dimensione (incluso un campo di bit di un bit), ilbool
valoreoriginalee il valore del campo di bit devono essere confrontati uguali. Se il valore di un enumeratore è memorizzato in un campo di bit dello stesso tipo di enumerazione e il numero di bit nel campo di bit è abbastanza grande da contenere tutti i valori di quel tipo di enumerazione (10.2), il valore dell'enumeratore originale e il il valore del campo di bit deve confrontare uguale . [ Esempio:
enum BOOL { FALSE=0, TRUE=1 };
struct A {
BOOL b:1;
};
A a;
void f() {
a.b = TRUE;
if (a.b == TRUE) // yields true
{ /* ... */ }
}
- esempio finale]
A prima vista, la parte in grassetto sembra aperta all'interpretazione. Tuttavia, l'intento corretto diventa chiaro quando enum BOOL
viene derivato da int
.
enum BOOL : int { FALSE=0, TRUE=1 }; // ***this line
struct mystruct { BOOL enabled:1; };
int main()
{
struct mystruct s;
s.enabled = TRUE;
if(s.enabled == TRUE)
printf("Is enabled\n"); // --> we think this to be printed
else
printf("Is disabled !!\n");
}
Con il codice sopra dà un avviso senza -Wall -pedantic
:
avviso: "mystruct :: enabled" è troppo piccolo per contenere tutti i valori di "enum BOOL"
struct mystruct { BOOL enabled:1; };
L'output è:
È disabilitato !! (quando si usa enum BOOL : int
)
Se enum BOOL : int
è reso semplice enum BOOL
, l'output è come il passaggio standard sopra specificato:
È abilitato (durante l'utilizzo enum BOOL
)
Quindi, si può concludere, anche come poche altre risposte hanno fatto, che il int
tipo non è abbastanza grande da memorizzare il valore "1" in un solo campo di bit.
int
penso che possa contenere solo i valori0
e-1
.