2012-07-04 8 views
8

Ho usato campo di bit con una struttura come questa,È valido utilizzare i campi bit con unione?

struct 
{ 
     unsigned int is_static: 1; 
     unsigned int is_extern: 1; 
     unsigned int is_auto: 1; 
} flags; 

Ora mi chiedevo per vedere se questo può essere fatto con un'unione così ho modificato il codice come,

union 
{ 
     unsigned int is_static: 1; 
     unsigned int is_extern: 1; 
     unsigned int is_auto: 1; 
} flags; 

ho trovato il bit field with union funziona ma tutti quei campi nell'unione sono dati in un singolo bit come ho capito dall'output. Ora sto vedendo che non è errato usare campi di bit con union, ma mi sembra che usarlo in questo modo non sia corretto dal punto di vista operativo. Quindi qual è la risposta? È valido utilizzare il campo bit con l'unione?

+0

prega, ciò che non funziona correttamente? – alk

risposta

12

Ti viene data una pistola e proiettili. Va bene sparare a te stesso con esso? Certo che no, ma nessuno può impedirti di farlo se vuoi.

Il mio punto è, proprio come la pistola e le pallottole, i campi di unione e bit sono strumenti e hanno il loro scopo, usi e "abusi". Quindi usare bitfield in unione, come hai scritto sopra, è perfettamente valido in C ma è un inutile codice. Tutti i campi all'interno dell'unione condividono la stessa memoria, quindi tutti i bitfield che hai menzionato sono essenzialmente lo stesso flag in quanto condividono la stessa memoria.

12

È valido ma, come hai scoperto, non è utile come l'hai fatto lì.

Si potrebbe fare qualcosa del genere in modo da poter ripristinare tutti i bit allo stesso tempo usando i flag.

union { 
    struct { 
     unsigned int is_static: 1; 
     unsigned int is_extern: 1; 
     unsigned int is_auto: 1; 
    }; 
    unsigned int flags; 
}; 

Oppure si potrebbe fare qualcosa di simile:

union { 
    struct { 
     unsigned int is_static: 1; 
     unsigned int is_extern: 1; 
     unsigned int is_auto: 1; 
    }; 
    struct { 
     unsigned int is_ready: 1; 
     unsigned int is_done: 1; 
     unsigned int is_waiting: 1; 
    }; 
}; 
+1

Ho aggiunto alcuni punti e virgola assumendo che volevi strutture anonime. Notate anche che non sono standard C. In gcc, dovete usare '-fms-extensions' perché questi funzionino. – unkulunkulu

Problemi correlati