2013-02-04 51 views
4
#include <iostream> 

enum IsOptionAEnum 
{ 
    IsOptionA_YES, 
    IsOptionA_NO 
}; 

enum IsOptionBEnum 
{ 
    IsOptionB_YES, 
    IsOptionB_NO 
}; 

void TestFunc(IsOptionAEnum optionA, IsOptionBEnum optionB) 
{ 
    if (optionA == IsOptionA_YES || optionA == IsOptionB_YES) // typo 
    { 
     // ... 
    } 

    //if (optionA == IsOptionA_YES || optionB == IsOptionB_YES) // correct one 
    //{ 
    //} 

} 

问题>optionAIsOptionAEnum类型的和不具有IsOptionB_YES值。为什么VS2010的编译器没有找到这个错误?为什么编译器不会抱怨错误枚举值

如果是编译器无法找到错误的情况,是否有办法强制执行此限制,以便编译器能够找到错误?

+2

你可以使用'enum class'es –

回答

5

虽然标准不使这样的错误(枚举有效语法在整数),这是肯定是一个编译器可以检测到。 Clang,与-Wenum-compare编译,得到:

Bonsai:~ adamw$ clang++ test.cpp 
    test.cpp:15:45: warning: comparison of two values with different enumeration 
     types ('IsOptionAEnum' and 'IsOptionBEnum') [-Wenum-compare] 
    if (optionA == IsOptionA_YES || optionA == IsOptionB_YES) // typo 
            ~~~~~~~^~~~~~~~~~~~~~ 

这可能是VISUAL C++默认情况下不警告这一点。尝试在编译器上设置/Wall标志,该标志将启用所有警告。如果它仍然没有发出警告,您可以向VC编译器团队提出请求。

编辑:其他答案和评论已经提到,如果你有一个VC11,你可以使用Strongly typed enums

1

非C++ 11的方案是使用struct小号

struct IsOptionAEnum 
{ 
    int val; 
    static IsOptionAEnum IsOptionA_YES; 
    static IsOptionAEnum IsOptionA_NO; 

    IsOptionAEnum(int v): val(v) {} 
}; 

IsOptionAEnum::IsOptionA_YES(0); 
IsOptionAEnum::IsOptionA_YES(1); 

if(optionA == IsOptionAEnum::IsOptionA_YES) // this is type-safe 
    // etc. 

它能够丢弃内在价值,如果你不需要它(你需要禁用复制,总是按引用传递和比较结构的地址)。

在C++ 11中,您可以使用typed enums,如Prashant建议的那样。

相关问题