2012-07-04 11 views
8

he utilizado de bits con una estructura como esta,¿Es válido usar campos de bit con unión?

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

Ahora me preguntaba para ver si esto se puede hacer con un sindicato, así que modifiqué el código como,

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

He encontrado el el campo de bit con union funciona, pero todos esos campos en la union se dan a un solo bit como entendí del resultado. Ahora veo que no es erróneo usar campos de bit con unión, pero me parece que usarlo así no es operacionalmente correcto. Entonces, ¿cuál es la respuesta? ¿Es válido usar el campo de bit con unión?

+0

Por favor, lo que no funciona correctamente? – alk

Respuesta

12

Le dan una pistola y balas. ¿Está bien disparar a ti mismo a pie con él? Por supuesto que no, pero nadie puede impedirte hacer esto si quieres.

Mi punto es que, al igual que el arma y las balas, los campos de unión y de bits son herramientas y tienen su propósito, usos y "abusos". Entonces, usar bitfields en unión, como lo has escrito anteriormente, es C perfectamente válido pero una pieza inútil de código. Todos los campos dentro de la unión comparten la misma memoria, por lo que todos los campos de bit que menciona son esencialmente la misma bandera, ya que comparten la misma memoria.

12

Es válido, pero como descubriste, no es útil como lo has hecho allí.

Puede hacer algo como esto para que pueda restablecer todos los bits al mismo tiempo usando banderas.

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

O podría hacer algo como esto:

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

He agregado algunos puntos y comas suponiendo que desea estructuras anónimas. También tenga en cuenta que no son estándar C. En gcc, debe usar '-fms-extensions' para que funcionen. – unkulunkulu

Cuestiones relacionadas