C bitfield- struct
s non sono un buon uso per bit singoli. Meglio usare uno unsigned int
e spostare/mascherare. Questo viene fatto in background comunque. I migliori tipi di larghezza fissa, ad es. uint32_t
, ecc.
Il codice nell'esempio richiama il comportamento non definito come già indicato in un commento. Si viola la regola del tipo efficace (alias rigoroso). Non usarlo mai così.
Tuttavia, è possibile utilizzare un composto letterale:
bf = (bitfield){ .bar = bf.bar };
per mantenere .bar
e impostare tutti gli altri campi per 0
.
Nota: esiste un altro problema con il codice: si utilizza int
. È specifico dell'implementazione se un bitfield con tipo int
è effettivamente firmato o non firmato. Quindi ogni campo può contenere 0
e 1
o 0
e -1
in implementazioni tipiche. Quindi lasci questo alla realizzazione. _Bool
OTOH è sempre senza segno con i valori 0
e 1
. Questo è lo stesso degli operatori logici. dei campi migliori booleani direttamente:
typedef struct {
bool foo : 1;
...
} bitfield;
(Mind the le ;
s)
State attenti con quella radura, se si dispone di meno o uguale numero di bit che si inserisce in un 'int' poi su 64- macchine bit che potresti scrivere fuori dai limiti se 'sizeof (long) == 8' (cioè se' long' è 64 bit e 'int' è 32 bit). Stai anche infrangendo la rigida regola dell'aliasing con quel cast. Una soluzione migliore sarebbe usare 'memset' invece (come' memset (& bf, 0, sizeof bf) ') –
Ehm, O vuoi cancellare tutto il bitfield o non lo fai! E il tuo codice richiama un comportamento indefinito. Un consiglio generale: non usare 'struct's bitfield. Usa mascheramento e sposta direttamente (sono comunque utilizzati dietro le quinte). – Olaf
'* (* long) & bf = 0;' è un errore di sintassi –