2012-06-29 65 views
3

我們使用2008年C++:如何檢查,該枚舉只

VS存在很大的枚舉,這是許多開發商

此枚舉有一個類型__int64(Microsoft擴展)填充唯一值,我想讓編譯器抱怨enum中的非唯一值。

如果這是一個平常的枚舉,我會做這樣的:

enum E1 
{ 
    E11 = 0x01F00, 
    E12 = 0x01F00, 
    E13 
}; 
#pragma warning(push) 
#pragma warning(error: 4061) 
#pragma warning(error: 4062) 
void F(E1 e1) 
{ 
    switch (e1) 
    { 
    case E11: 
    case E12: 
    case E13: 
     return; 
    } 
} 
#pragma warning(pop) 

和函數F將有一個錯誤,如果E1有2個相同的價值觀

而且還會有一個錯誤,如果一個開發人員忘了添加一個新值切換

,但我的枚舉的類型爲__int64(或long long)

,當我嘗試做E1 E1在同一臺交換機它截斷v如果我將e1轉換爲__int64,編譯器不會抱怨,如果開發人員忘記向交換機中添加一個新值(因此,如果我將e1轉換爲__int64,編譯器不會抱怨,整個檢查功能變得無用)

問題:有人知道我能做些什麼嗎?或者也許VS 2008(或C++)有另一種工具來確保枚舉:__int64只有唯一值?

+2

我能想到的最好的是'不要明確指定值(除第一個之外)'。 –

+0

@Mark有時候枚舉是有用的,因爲如果交換機中某些值被遺漏,編譯器會警告您。另一方面,價值本身可以用於其他一些目的(不僅用於區分案例)。 – Yury

+0

@Mark,這些值是標誌(0x000..01,0x00..02,0x00..04等) – Alek86

回答

2

從你的評論我會假設你沒有在枚舉本身的聚合(組合)標誌。在這種情況下,您可以使用兩個枚舉使錯誤更難。你仍然可以顛覆編譯器,但我認爲這不是真正的問題。

enum Bit_Index 
{ 
    FLAG1_INDEX, 
    FLAG2_INDEX, 
    FLAG_FANCY_INDEX, 
    LAST_INDEX 
}; 

#define DECLARE_BIT_VALUE(att) att##_VALUE = 1ULL << att##_INDEX 
enum Bit_Value 
{ 
    DECLARE_BIT_VALUE(FLAG1), 
    DECLARE_BIT_VALUE(FLAG2), 
    DECLARE_BIT_VALUE(FLAG_FANCY), 

    // Declared NOT using the macro so we can static assert that we didn't forget 
    // to add new values to this enum. 
    LAST_BIT // Mainly a placeholder to prevent constantly having to add new commas with new ids. 
}; 
#undef DECLARE_BIT_VALUE 

然後在實現文件你static_assert以確保枚舉沒有得到錯位:

// Make sure to the best of our abilities that we didn't mismatch the index/bit enums. 
BOOST_STATIC_ASSERT((LAST_BIT - 1) == (1U << (LAST_INDEX - 1))); 
+0

好主意。我可以用開關檢查第一個枚舉(並希望其他人以同樣的方式使用第二個枚舉)。這不是一個100%的保證,但更好,比沒有。謝謝。 – Alek86

0

是否有人知道我能做些什麼。

其他答案可以是算法分析。靜態分析不一定是搜索安全漏洞。不幸的是,在這種情況下,您將不得不使用外部工具來驗證約束條件。我可以幫助你實現這一點。