枚举的返回类型是什么?

时间:2010-11-24 11:59:21

标签: c syntax

enum FileOpenFlags
{
    FileOpenFlags_Create = 1,
    FileOpenFlags_Truncate = 2,
};


FileOpenFlags flags = FileOpenFlags_Create | FileOpenFlags_Truncate;

enum |的返回类型是否也是enum ??

6 个答案:

答案 0 :(得分:2)

不,上面的表达式将具有int类型。但是,由于enum毫无问题地转换为int,因此它会隐式转换回商店的enum

另见this comp.lang.c FAQ entry

答案 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 ++中失败;)