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 bitbooldi qualsiasi dimensione (incluso un campo di bit di un bit), ilboolvaloreoriginalee 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 BOOLviene 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 inttipo non è abbastanza grande da memorizzare il valore "1" in un solo campo di bit.
intpenso che possa contenere solo i valori0e-1.