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