我假设myState
有你的类型enum State
.
传统的使用enum
是创建该类型的变量可以采用的常量值。您希望设置变量myState
to a 组合中定义的值enum
.
The 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
and next
独立。
如果您仍然想要位字段,则可以以位为单位设置结构体元素的大小。但这有点危险,位字段的实现取决于您的编译器。我什至不确定编译器是否会接受在位字段中使用枚举类型(在 C 中应该没问题,因为enum
s are int
).
typedef struct {
win_size_t current : 2; // not tested
win_size_t next : 2;
} state_t;
前面给出的解决方案当然是有效的。我的观点是,如果你的变量myState
有你的enum State
作为类型,它应该只使用enum
其价值,而不是组合。
Maybe myState
还有另一种类型,我知道什么。
If 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?