2010-03-18 2 views
25

나는이 다음 코드 : 이런 일이 왜익명 열거 형을 C에서 다른 열거 형과 같지만 C++에서 설정할 수없는 이유는 무엇입니까?

test.c:6: error: cannot convert ‘main()::<anonymous enum>’ to ‘main()::<anonymous enum>’ in assignment 

누군가가 나에게 설명 할 수 : C에서 컴파일하지만, C++, 나는 다음과 같은 오류가 발생합니다

enum { one } x; 
enum { two } y; 
x = y; 

? 나는 왜 컴파일러가 왜 이런 식으로 행동하는지에 대한 몇 가지 구체적인 답을 원한다. 단지 "할 수 없다"이다.

+3

이것은 매우 잘 알려지지 않은 질문입니다. –

+2

다행 니 기쁘다! – samoz

+0

누군가가 열거 형을 사용한다고 말하면이 예를 기억할 것입니다. 왜냐하면 잘못된 코드를 작성하는 것을 방지하기 때문입니다. 기본적으로 C를 사용하면 코드를 작성할 수 있습니다. 잘못된 코드를 작성하면 잘못된 코드가 생성됩니다. 암시 적 캐스트를 사용하는 것은 나쁜 코드이며, C가이 케이스만큼이나 나쁜 것처럼 보일 수도 있습니다. 추가 질문 :이 무언가가 컴파일러에 해킹되어 상수를 만들기 위해 명명되지 않은 열거 형을 사용하는 것을 "완전히 지원"합니까? 아마 그렇게. –

답변

33

하나의 열거 형에서 다른 열거 형으로의 변환은 정수형을 통해 이루어진다. 출처, 확실하지 않음).

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 유형 모두 기본 정수 유형을 갖고 관련이 있으므로 사실상 "관련성"이 있습니다. 따라서 "관계"가 실제로 그렇게 많은 것을 말하지 않습니다. 이 코드를 작성하면 형식 안전성이 떨어집니다.

+0

당신은이 점에 대해 많은 것을 알고 있습니다. Boost TYPEOF (또는 다른 수단)가 익명의 enum 변수에 외래형을 할당하는 데 필요한 형변환 식을 생성 할 수 있는지 확인하고 언급하지 않는 이유는 무엇입니까? (편집 - 부스트가 설치되지 않았거나, 스캔들!, 또는 시도하고 싶습니다.) – Potatoswatter

+0

충분히 정교합니다. 왜 당신이 그것을하고 싶지는 모르겠지만 정수와 같은 열거 형을 처리하려면 익명 열거 형을 사용하지 마십시오 :-) 나는 구식 버전을 고집하고 typeof를 가지고 있지 않습니다. ,하지만 g ++에서 시도하고 익명 형식을 사용하여 행복해 보인다. 나는'decltype'이 똑같이 할 것인가를 확인하지 않았다. –

+0

내가 필요로 본 유일한 이유는 직렬화를위한 것이 었습니다. 열거 형은 정수형으로 직렬화되고 정수형에서 먼저 직렬화가 해제되고 열거 형 (enum)으로 변환됩니다. 필자가 항상 부호가없는 정수 유형을 사용했기 때문에 항상 어색함을 발견했습니다. –

1

제 생각에 이것은 C++의 엄격한 타이핑 때문인 것 같습니다.

에서 C x = 5;도 컴파일됩니다. C++에서는 타입 변환이 정의되어 있지 않기 때문에 그렇지 않습니다. 이것이 x = y가 컴파일되지 않는 이유입니다.

this example on codepad에서 컴파일러보다 자세한 오류 설명을 볼 수 있습니다.

0

컴파일러는 열거 형 데이터 형식을 암시 적으로 다른 형식으로 변환하는 방법을 알지 못합니다.

다음을 시도해보십시오.

enum typeX { one } x; 
enum typeY { two } y; 
x = (typeX) y; 
+0

저는 주로 익명의 enum과 관련이 있습니다. – samoz

+0

@samoz - 열거 형의 이름이 지정되었는지 여부에 관계없이 대답은 동일합니다. 컴파일러가 암시 적으로 변환하는 방법을 모르는 두 가지 새로운 데이터 유형을 작성 했으므로 오류가 발생합니다. – semaj

관련 문제