enum FileOpenFlags
{
FileOpenFlags_Create = 1,
FileOpenFlags_Truncate = 2,
};
FileOpenFlags flags = FileOpenFlags_Create | FileOpenFlags_Truncate;
是不是真的返回类型enum |
也是enum
?什么是枚举的返回类型|?
enum FileOpenFlags
{
FileOpenFlags_Create = 1,
FileOpenFlags_Truncate = 2,
};
FileOpenFlags flags = FileOpenFlags_Create | FileOpenFlags_Truncate;
是不是真的返回类型enum |
也是enum
?什么是枚举的返回类型|?
不,上述表达式的类型为int
。但是,由于enum
s可以毫无问题地从int
转换而来,所以它会被隐式转换回enum
。请参阅this comp.lang.c FAQ entry。
枚举值只是一个整数,对枚举值的操作不保证返回定义的枚举值。
不,它不会和c不真正关心。即使枚举值|返回的值仍然可以分配给枚举枚举与您定义的任何枚举的值不匹配。
他们都是整数就为C而言
我通常使用的#define定义的标志,
#define FLAG_1 0x1
#define FLAG_2 0x2
#define FLAG_3 0x4
...
如果您使用枚举和希望独立的标志,可以被'或'在一起,你将不得不使用'='运算符为它们赋值。
在这种情况下,您不应该真的将这两个联合存储回枚举类型 - 因为新值不是该枚举的有效值!相反,将它们存储到一个int中。
或者,看看在c bit field types (wikipedia)
struct FOF {
int Create : 1;
int Truncate : 1;
};
我认为这是有效的,(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++中失败了);
而`enum`方法稍微好一些,因为它给你一个常量的C标记而不是预处理器定义。 – JeremyP 2010-11-24 15:14:40