2010-06-30 51 views
4

考慮以下(簡化)代碼:在C++中使用enum進行整數位操作可靠/安全嗎?

enum eTestMode 
{ 
    TM_BASIC  = 1, // 1 << 0 
    TM_ADV_1  = 1 << 1, 
    TM_ADV_2  = 1 << 2 
}; 

... 

int m_iTestMode; // a "bit field" 

bool isSet(eTestMode tsm) 
{ 
    return ((m_iTestMode & tsm) == tsm); 
} 

void setTestMode(eTestMode tsm) 
{ 
    m_iTestMode |= tsm; 
} 

這是可靠的,安全的和/或好的做法呢?或者除了使用const ints而不是枚舉之外,是否有更好的方法來實現我想要做的事情?我真的更喜歡枚舉,但代碼可靠性比可讀性更重要。

回答

5

在這種設計中,我看不到任何不好的東西。

但請記住,enum類型可以保存未指定的值。根據誰使用您的功能,您可能首先要檢查tsm的值是否爲有效的枚舉值。

由於enums是整數值,我們可以這樣做:

eTestMode tsm = static_cast<eTestMode>(17); // We consider here that 17 is not a valid value for your enumeration. 

但是,這樣做是醜陋的,你可能只是認爲,這樣做導致不確定的行爲。

0

沒有問題。您甚至可以使用eTestMode的變量(併爲該類型定義位操作),因爲在這種情況下,它將保證所有可能的值。

0

What is the size of an enum in C?

見對於一些編譯器(例如VC++)此非標準寬度說明可用於:

 
enum eTestMode : unsigned __int32 
{ 
    TM_BASIC  = 1, // 1 << 0 
    TM_ADV_1  = 1 << 1, 
    TM_ADV_2  = 1 << 2 
}; 
0

使用用於表示位模式,口罩和標誌枚舉不總是一個好主意,因爲枚舉一般推動到簽名整數類型,而對於基於位的操作無符號類型幾乎總是可取的。

相關問題