2010-11-24 162 views
1
enum FileOpenFlags 
{ 
    FileOpenFlags_Create = 1, 
    FileOpenFlags_Truncate = 2, 
}; 


FileOpenFlags flags = FileOpenFlags_Create | FileOpenFlags_Truncate; 

是不是真的返回类型enum |也是enum什么是枚举的返回类型|?

回答

2

不,上述表达式的类型为int。但是,由于enum s可以毫无问题地从int转换而来,所以它会被隐式转换回enum。请参阅this comp.lang.c FAQ entry

1

枚举值只是一个整数,对枚举值的操作不保证返回定义的枚举值。

2

不,它不会和c不真正关心。即使枚举值|返回的值仍然可以分配给枚举枚举与您定义的任何枚举的值不匹配。

他们都是整数就为C而言

1

我通常使用的#define定义的标志,

#define FLAG_1 0x1 
#define FLAG_2 0x2 
#define FLAG_3 0x4 

...

如果您使用枚举和希望独立的标志,可以被'或'在一起,你将不得不使用'='运算符为它们赋值。

+1

而`enum`方法稍微好一些,因为它给你一个常量的C标记而不是预处理器定义。 – JeremyP 2010-11-24 15:14:40

1

在这种情况下,您不应该真的将这两个联合存储回枚举类型 - 因为新值不是该枚举的有效值!相反,将它们存储到一个int中。

或者,看看在c bit field types (wikipedia)

struct FOF { 
    int Create : 1; 
    int Truncate : 1; 
}; 
0

我认为这是有效的,(int)3应该在你的例子被退回。

就我而言,C将枚举值视为类型int通过内部演员或沿着这些行的东西。带枚举的事情是,在C++中它们不能是操作的LVALUE(因为它们不被视为数字),所以你不能增加它们或为它们赋值。 OTOH,你可以随时使用它们作为右值(无论是在C和C++),所以:

int flags = FileOpenFlags_Create | FileOpenFlags_Truncate; 

是C和C++有效,而

FileOpenFlags flags = FileOpenFlags_Create | FileOpenFlags_Truncate; 

将是在C工作,但在C++中失败了);