하나의 열거 형에서 다른 열거 형으로의 변환은 정수형을 통해 이루어진다. 출처, 확실하지 않음).
C 및 C++에서 열거 형에서 정수 유형으로의 암시 적 변환이 허용됩니다. 정수 형식에서 열거 형으로의 암시 적 변환은 C에서는 허용되지만 C++에서는 허용되지 않습니다.
기본적으로 C++은 더 안전합니다. 이 일을 중지하려고 :
enum {zero, one, two} x;
x = 143; // assigns a value outside the range of the enum
는 C++이 열거-열거 변환을 수행하려면 대해서 typeof/declspec/부스트 대해서 typeof 또는 동등한를 사용할 수 있습니다. GCC에서 :
int main() {
enum {zero, one, two} x;
enum {zero1, one1, two1} y = two1;
typedef typeof(x) xtype;
x = static_cast<typeof(x)>(y);
}
일반적으로 그렇게하는 것이 좋습니다. 대부분의 경우 열거 형 (특히 익명의 열거 형)은 "열거 형"입니다. 그들은 단지 우연한 모자를 쓰는 정수로 C 및 C++ 표준에 의해 "구현"되지만, red
은 두 개의 서로 다른 열거 형 (색상 및 도구 각각에 첫 번째로 표시되기 때문에 hammer
과 같음을 의미하지 않습니다.). static_cast
은 두 가지 유형이 관련되어 있음을 나타냅니다. 두 개의 enum 유형 모두 기본 정수 유형을 갖고 관련이 있으므로 사실상 "관련성"이 있습니다. 따라서 "관계"가 실제로 그렇게 많은 것을 말하지 않습니다. 이 코드를 작성하면 형식 안전성이 떨어집니다.
이것은 매우 잘 알려지지 않은 질문입니다. –
다행 니 기쁘다! – samoz
누군가가 열거 형을 사용한다고 말하면이 예를 기억할 것입니다. 왜냐하면 잘못된 코드를 작성하는 것을 방지하기 때문입니다. 기본적으로 C를 사용하면 코드를 작성할 수 있습니다. 잘못된 코드를 작성하면 잘못된 코드가 생성됩니다. 암시 적 캐스트를 사용하는 것은 나쁜 코드이며, C가이 케이스만큼이나 나쁜 것처럼 보일 수도 있습니다. 추가 질문 :이 무언가가 컴파일러에 해킹되어 상수를 만들기 위해 명명되지 않은 열거 형을 사용하는 것을 "완전히 지원"합니까? 아마 그렇게. –