enum FileOpenFlags
{
FileOpenFlags_Create = 1,
FileOpenFlags_Truncate = 2,
};
FileOpenFlags flags = FileOpenFlags_Create | FileOpenFlags_Truncate;
enum |
的返回类型是否也是enum
??
答案 0 :(得分:2)
不,上面的表达式将具有int
类型。但是,由于enum
毫无问题地转换为int
,因此它会隐式转换回商店的enum
。
答案 1 :(得分:2)
不,它没有,c并不真正关心。即使enum |返回的值,您仍然可以将它分配给枚举枚举与您定义的任何枚举的值不匹配。
就c而言,它们都是整体的
答案 2 :(得分:1)
枚举值只是一个整数,对枚举值的操作不能保证返回定义的枚举值。
答案 3 :(得分:1)
我通常使用#define,
定义标志#define FLAG_1 0x1
#define FLAG_2 0x2
#define FLAG_3 0x4
...
如果您使用枚举并想要可以一起“或”运算的单独标志,则必须使用“=”运算符为它们分配值。
答案 4 :(得分:1)
在这种情况下,您不应该将这两者的并集存储回枚举类型 - 因为新值不是该枚举的有效值!将它们存储到int中,而不是。
或者,请查看c bit field types (wikipedia)
struct FOF {
int Create : 1;
int Truncate : 1;
};
答案 5 :(得分:0)
我认为这是有效的,(int)3
应该在您的示例中返回。
就我而言,C通过内部演员或类似的东西将枚举值视为类型int
。带枚举的东西是在C ++中它们不能是操作的LVALUE(因为它们不被视为数字),所以你不能递增它们或为它们赋值。 OTOH,你总是可以将它们用作RVALUE(用C和C ++),所以:
int flags = FileOpenFlags_Create | FileOpenFlags_Truncate;
在C和C ++中都有效,而
FileOpenFlags flags = FileOpenFlags_Create | FileOpenFlags_Truncate;
可能在C中工作,但在C ++中失败;)