Voy a suponer que myState
tiene el tipo de su enum State
.
El uso tradicional de enum
es crear los valores constantes que una variable de este tipo puede tomar. Desea establecer la variable myState
en una combinación de los valores definidos en enum
.
El enum
define 1, 2, 4 y 8 como valores válidos, pero desea poder establecer la variable en 4 | 2 = 6. Mientras que C usa su tipo int
definido por implementación para todos enum
, no es el caso en C++. myState = 6
no es válido en C++. En realidad, myState = 4
no es válido en C++, necesita emitir explícitamente o usar uno de los nombres de constante del enum
.
Aunque es posible en C, no es una buena práctica establecer myState
en un valor que no esté definido por su tipo (por ejemplo, a 6).
En su caso, una solución que parece consecuente sería:
typedef enum {
OTHER,
MINIMIZED,
MAXIMIZED
} win_size_t;
typedef struct {
win_size_t current;
win_size_t next;
} state_t;
state_t myState;
De esta manera, se puede escribir en los campos current
y next
undependently.
Si aún desea tener campos de bit, puede establecer el tamaño de los elementos de su estructura en bits. Aunque es algo peligroso, la implementación de los campos de bit depende de tu compilador. Ni siquiera estoy seguro de si los compiladores aceptarían tener un tipo de enumeración en un campo de bit (debería estar bien en C, ya que enum
s son int
).
typedef struct {
win_size_t current : 2; // not tested
win_size_t next : 2;
} state_t;
Las soluciones anteriores son válidas, por supuesto.Mi punto es que si su variable myState
tiene su tipo enum State
, solo debe usar los miembros de enum
para sus valores, no una combinación.
Tal vez myState
tiene otro tipo, ¿qué sé yo?
Si myState
no es del tipo enum State
, entonces puede usar las constantes definidas en su enum
en combinación.
enum State {
MINIMIZING = (1u << 0),
MAXIMIZING = (1u << 1),
MINIMIZED = (1u << 2),
MAXIMIZED = (1u << 3),
};
unsigned int myState = 0;
myState |= MAXIMIZED; // sets that bit
myState &= ~MAXIMIZED; // resets that bit
Esto le permite hacer dos cosas en una asignación:
myState = MAXIMIZED | MINIMIZING;
Pero también cosas que no es probable que desee:
myState = MAXIMIZED | MINIMIZED; // does that make sense?
gracias! Fui por la opción n. ° 1. De hecho, eso no tiene sentido que 'MAXIMIZED | MINIMIZED' es posible, y es mejor para la legibilidad tener dos enumeraciones. –
Tenga en cuenta que restringir las enumeraciones a los archivos de bits es un comportamiento indefinido y el resultado depende del compilador. También por favor corrígeme si estoy equivocado. –
@ DavidTóth Parece que tienes razón, ¡gracias por esto! https://stackoverflow.com/a/33590935/108802 – Gauthier