2010-11-24 161 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++中失敗了);