2012-06-29 40 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

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

其他答案可以是算法分析。静态分析不一定是搜索安全漏洞。不幸的是,在这种情况下,您将不得不使用外部工具来验证约束条件。我可以帮助你实现这一点。