2013-02-04 167 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建議的那樣。

相關問題