2013-06-20 3 views
0

내 C++ 03 구성 요소 중 하나에서 enum에서 global const int로 이동 중입니다. enum{ RED=0, GREEN, BLUE };const unsigned int RED = 0, GREEN = 1, BLUE = 2;증가하는 값으로 전역 변수 초기화

으로 변경되었습니다. 문제는 전역 const 변수에 해당하므로 각 값을 명시 적으로 초기화해야합니다. 전의. 값이 100 인 열거 형을 사용하면 값을 순서대로 유지하는 것이 매우 어렵습니다. 이 열거 형의 중간에서 값을 제거하려는 경우 큰 제거 (즉, 제거 된 열거 형 뒤에 모든 열거 형 값의 값 변경)입니다.

이 해결 방법을 만들었지 만 다른 컴파일러와 대상에서 결과가 보장되는지 여부는 알 수 없습니다.

#define CREATE_GLOBAL_COUNT(name, val) static unsigned int g_counter_##name = val 
#define INC_GLOBAL_COUNT(name) g_counter_##name ++ 

CREATE_GLOBAL_COUNT(color, 0); 

const int RED = INC_GLOBAL_COUNT(color), 
GREEN = INC_GLOBAL_COUNT(color), 
BLUE = INC_GLOBAL_COUNT(color); 

편집 : 주요 동기는 헤더 파일 간의 의존성을 줄이는 것입니다. 열거 형을 사용해야하는 구성 요소에는 enum_definition.h 파일이 포함되어야합니다. 새로운 솔루션에서는 전역 변수를 extern하여 사용하면됩니다.

+2

그리고 질문은? –

+0

당신이 인용하는 문제는 enum에도 적용됩니다. * == ++ color *를 명시 적으로 지정하면 이러한 문제가 발생하지 않습니다. 이 경우 매크로는 필요하지 않으며 가능한 경우 사용하지 않는 것이 가장 좋습니다. –

+3

열거 형을 그대로 유지하고자하는 것 같습니다. 왜 그걸 바꾸는거야? –

답변

3

더 좋은 방법으로 변경하지 않아야합니다.

정말로 열거 형 문제는 무엇입니까? Scott Meyers조차도 "enum hack"은 공정한 게임이고 열거 자들은 const int보다 근사한 이름이 붙은 리터럴 방법에 동의했습니다. * 무슨 btw 또한 암시 적 정적과 해킹입니다).

1

간단합니다. 내가 뭘 놓치고 있니? 대신 GREEN '의 RED를 사용하도록 변경할 때까지

const int RED = 0; 
const int GREEN = RED + 1; 
const int BLUE = GREEN + 1; 

은 이제 GREEN을 제거하기로 결정한 경우, BLUE의 정의는 컴파일되지 않습니다. 그 이후의 모든 값은 괜찮습니다. 그들은 1로 이동합니다.