Я собираюсь предположить, что myState
имеет тип вашего enum State
.
Традиционное использование enum
заключается в создании значений констант, которые может принимать переменная этого типа. Вы хотите установить переменную myState
в комбинацию значений, определенных в enum
.
enum
определяет 1, 2, 4 и 8 как допустимые значения, но вы хотите иметь возможность установить переменную на 4 | 2 = 6. Хотя C использует ваш определяемый реализацией тип int
для всех enum
, в C ++ это не так. myState = 6
недопустимо в C ++. На самом деле, myState = 4
недопустим в C ++, вам нужно привести в явном виде или использовать одно из имен констант enum
.
Хотя это возможно в C, не рекомендуется устанавливать myState
в значение, которое не определено его типом (например, в 6).
В вашем случае решение, которое кажется последовательным, будет:
typedef enum {
OTHER,
MINIMIZED,
MAXIMIZED
} win_size_t;
typedef struct {
win_size_t current;
win_size_t next;
} state_t;
state_t myState;
Таким образом, вы можете писать в поля current
и next
независимо.
Если вы все еще хотите иметь битовые поля, вы можете установить размер элементов вашей структуры в битах. Хотя это опасно, реализация битовых полей зависит от вашего компилятора. Я даже не уверен, что компиляторы согласятся иметь тип enum в битовом поле (должно быть нормально в C, поскольку enum
s int
).
typedef struct {
win_size_t current : 2; // not tested
win_size_t next : 2;
} state_t;
Предыдущие приведенные решения действительны, конечно. Я хочу сказать, что если ваша переменная myState
имеет тип enum State
, она должна использовать только члены enum
для своих значений, а не комбинацию.
Может быть, myState
имеет другой тип, что я знаю.
Если myState
не относится к типу enum State
, вы можете использовать константы, определенные в вашем enum
, в комбинации.
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
Это позволяет вам делать две вещи в одном назначении:
myState = MAXIMIZED | MINIMIZING;
Но также вещи, которые вы вряд ли захотите:
myState = MAXIMIZED | MINIMIZED; // does that make sense?