2014-09-11 3 views
0

나는 서명 된 또는 서명되지 않은 열거 형의 기본 구현을 신뢰하면 안된다는 것을 읽었습니다. 이것으로부터 나는 여러분이 항상 enum 값을 그것이 비교되는 타입으로 던져야한다고 결론 지었다. 좋아요 :열거 형을 정수로 비교하기

enum MyEnum { MY_ENUM_VALUE = 0 }; 

int i = 1; 
if (i > static_cast<int>(MY_ENUM_VALUE)) 
{ 
    // do stuff 
} 

unsigned int u = 2; 
if (u > static_cast<unsigned int>(MY_ENUM_VALUE)) 
{ 
    // do more stuff 
} 

이 방법이 가장 좋습니다.

편집 : 열거 형이 익명이면 상황이 변경됩니까?

답변

0

짧은 답변 :

enumsigned int 유형입니다,하지만 그들은 암묵적으로 unsigned int에 던져 얻는다. 컴파일러는 명시 적 캐스팅없이 경고를 줄 수도 있지만 여전히 많이 사용됩니다. 그러나 관리자에게 명확하게 알리기 위해 명시 적으로 캐스팅해야합니다.

그리고 물론 explicit cast will be must when its a strongly typed enum. 당신의 예에서와 같이 - - 당신은 당신의 열거 한 가치를 가지고로 선언하는 것이 좋습니다

+0

"enum은 int 유형으로 서명되었지만 암시 적으로 unsigned int로 변환됩니다."이것은 잘못되었습니다. 범위가 지정되지 않은'enum'의 기본 유형은 가장 큰 열거 자에 맞을 수있는 정수 유형입니다. 즉, 'INT_MAX'보다 크면 'unsigned int', 'long', 'unsigned long'등이 될 수 있으며, 가장 큰 열거 자 (isn ' t 항상'unsigned int'). – Simple

0

모범 사례 대신

MyEnumValue i = MY_ENUM_VALUE ; 
... 
if (i > MY_ENUM_VALUE) {..} 

쓰기 그러나 경우

int i = 1; 
if (i > static_cast<int>(MY_ENUM_VALUE)) 
{ 
    // do stuff 
} 

를 작성하지 않습니다 열거 형 대신 상수.

+0

상수로 정의 된 값이 열거 형에 정의되어있을 때 주로이 상황이 발생한다는 것에 동의합니다. – khuttun

0

enum은 정수이므로 다른 정수와 비교할 수 있으며 수레도 있습니다. 컴파일러는 두 정수를 최대 값으로 자동 변환하거나 비교하기 전에 두 값을 열거 형으로 자동 변환합니다.

당신의 열거가 자체 숫자를 표현하기로되어 있지 않은 경우 지금은, 대신 클래스를 생성하는 것이 좋습니다 : 열거 클래스가 조회되지 않기 때문에

enum class some_name { MY_ENUM_VALUE, ... }; 

int i; 
if(i == static_cast<int>(some_name::MY_ENUM_VALUE)) 
{ 
    ... 
} 

당신이 캐스트를 필요로하는 경우 기본적으로 정수로 이것은 열거 형 값을 잘못 사용하는 경우 버그를 피하는 데 상당히 도움이됩니다 ...