2009-10-04 6 views
3

코딩 연습의 관점에서 열거 형보다 전역 상수가 선호되는 컨텍스트는 무엇입니까?전역 상수와 열거 형

예를 들어 전역 범위에서 다양한 타일 스프라이트를 표현할 방법이 필요하다고 가정 해 보겠습니다. 내가 할 수있는 ...

const int TILE_RED = 0; 
const int TILE_GREEN = 1; 
const int TILE_BLUE = 2; 
const int TILE_CENTER = 3; 
const int TILE_TOP = 4; 
const int TILE_TOPRIGHT = 5; 
const int TILE_RIGHT = 6; 
const int TILE_BOTTOMRIGHT = 7; 
const int TILE_BOTTOM = 8; 
const int TILE_BOTTOMLEFT = 9; 
const int TILE_LEFT = 10; 
const int TILE_TOPLEFT = 11; 

또는

enum Tile { TILE_RED, TILE_GREEN, TILE_BLUE, TILE_CENTER, TILE_TOP, TILE_TOPRIGHT 
TILE_RIGHT, TILE_BOTTOMRIGHT, TILE_BOTTOM, TILE_BOTTOMLEFT, TILE_LEFT, TILE_TOPLEFT }; 

분명히 우리가 매크로에 대한 상수 및 열거 형이 선호하는,하지만 그것은 상수 및 열거 형에 내려 오는 경우는 어떻습니까? 어떤 상황에서 무엇을 선호합니까? 나는 일정한 객체가 당신의 프로그램을 느리게 만드는 작은 위험을 제기한다고 here을 읽었지 만 다른 사람들의 생각을 듣고 싶습니다.

이 예제는 관련 객체의 커다란 세트 인 열거 형 고양이 파자마 때문에 특히이 예제를 사용했습니다.

답변

4

열거 형의 좋은 점 중 하나는 C와 C++ 사이에서 이식 가능하다는 것입니다. 반면에 const 항목은 원하는 모든 장소에서 (예 : 배열 선언과 같이) C에서 사용할 수 없습니다. 따라서 C 또는 C++에서 작업하고 싶은 헤더의 경우 const 선언이나 매크로 정의보다 열거 형을 사용하는 경향이 있습니다. 사실 나는 헤더가 C++만을위한 것인지 아닌지에 관계없이 이들을 사용하는 경향이 있습니다.

열거 형의 유형을 모호하게 만드는 것은 매우 자주 문제가되지 않습니다. 다양한 정수 유형을 기반으로 오버로드하는 경우 열거 형에 잠재적 인 문제점이있을 수 있으며,이 경우 const 항목이 더 좋을 것입니다 . 그러나 나는 같은 번호의 다른 유형 (즉, 5U5 또는 5L과 다르게 취급)에 대해 다른 행동이 필요한 마지막 시간을 기억할 수 없습니다. 오버로드의 유형은 퍼즐/인터뷰 유형의 문제에서만 실제로 볼 수 있습니다. 또는 열거 형을 사용하는지 여부와 관계없이 버그를 번식시킬 코드입니다.

그래서 결론은 열거 형을 선호하지만, 행운을 빌어 직장 동료가 매크로 사용을 중단하게하십시오. 명명 된 상수에 매크로를 사용하는 것은 C/C++ 문화에 깊이 뿌리 박혀 있으며 큰 방법으로 네임 스페이스를 오염시킬지라도 많은 사람들이 습관을 바꾸는 것에 대해서도 생각하도록 설득하기에 실제 단어 문제가 충분하지 않습니다.

2

예제에서와 같이 상수 값이 중요하지 않거나 순차적이지 않은 경우 enum을 사용하십시오.

식별자에 특수 상수 값이 필요하면 상수를 사용하십시오.

0

명시 적이 아닌 enum은 일부 플랫폼 호환성 문제를 일으킬 수 있으며 형식 안전하지 않습니다. 전역 상수는 유형에 안전하며 일반적으로 선호됩니다. 그러나 이것을 간과한다면 열거 형은 일반적으로 더 관련이없는 것들에 관련된 것들과 상수에 사용됩니다.

예 사용할 것 열거 : 전역 consts을 사용하는 경우

enum Colors { 
COLOR_RED=0xFF0000, 
COLOR_GREEN=0x00FF00, 
COLOR_BLUE=0x0000FF 
} 

예 : 당신이 정말로 플랫폼 호환성을 걱정하는 경우

volatile const void *VRAM=0x00FC0000; 

마지막으로, 내 조언이에게, 다음 글로벌 사용하는 것이 consts. 열거의

+2

"명확하지 않은 enum이 일부 플랫폼 호환성 문제를 일으킬 수 있습니다."- 예를 참조하십시오. 또한 "유형을 지정하지 않음"으로 무엇을 의미합니까? 더 이상 전역 상수는 어떻게됩니까? –

+0

"비 명시 적"은 열거 형이없는 것을 의미합니다. 플랫폼 호환성 문제는 리눅스 박스에서 발견되었고 이것을 수정했습니다. 좋은 컴파일러는 암시 적으로 const를 캐스팅하려고하면 그것을보고합니다. – aviraldg

+0

언급 한 libc 플랫폼 호환성 수정에 대한 정보를 가르쳐 주시겠습니까? 나는 이것에 대해 배우고 싶다. –

4

두 관련 장점은를 네임 스페이스가 명확 유지 그들의 자기 문서화 자연과 사실입니다. 기본적으로 열거 형은 자체 네임 스페이스 내에서 의미 상 관련된 상수의 번들과 같습니다. intefaces에서 열거 형을 사용하면 예상되는 값 집합을 암시 적으로 나타냅니다.

편집 : 수정! (너무 많은 C#을 요즘과 같이하고 C/C++을 충분하게 수행하지 못했습니다!)
C 및 C++ 열거 형의 식별자는 일반 변수 및 상수처럼 범위가 지정되므로 다른 식별자 다른 열거 목록 내의 식별자를 포함하여 동일한 범위에 있습니다. 이는 enum이 자체 네임 스페이스를 도입하는보다 현대적인 언어와는 다릅니다. C/C++ enum이 네임 스페이스를 깔끔하게 유지하는 데 도움이된다는 개념은 결과적으로 올바르지 않습니다. Michael Burr, 지적 해 주셔서 감사합니다.

열거 형의 가장 큰 단점은 으로 쉽게 휴대 할 수 없다는 것입니다.. 상수 타입과 값은 명확하게 정의되어 있으므로 열거 형의 명확성이 떨어집니다.

+0

enum은 const보다 네임 스페이스를 어떻게 더 명확하게 유지합니까? 둘 다 네임 스페이스에 있습니다. 동일한 네임 스페이스 '레벨'에 동일한 이름의 const 및 enum을 사용할 수 없습니다. 여기에서 중요한 것은 열거 형의 이름이 아니라 실제 열거 형의 이름 (예 :'TILE_RED')입니다 (예 :'enum Tile'). –

+0

@Michael Burr 죄송합니다! 내 편집에서 말했듯이, 나는 C#의 기능을 당연시하고있다. C/C++에서 열거 형은 자체 네임 스페이스를 도입하지 않으므로 열거 형 목록의 식별자는 기본 범위의 네임 스페이스를 공유해야합니다. 따라서 C/C++의 enum의 장점은 다소 희박합니다. 특히 컴파일러 프로젝트가 혼합되어있을 때 발생할 수있는 잠재적 인 interop 문제를 고려해 보았습니다. 나를 정직하게 해주셔서 감사합니다. – mjv

1

열거 형의 가장 큰 장점은 컴파일러에서 적용 할 수 있다는 것입니다. 예를 들어 상수가 아닌 경우입니다.

+0

AFAIK C 컴파일러는 enum 유형 지정 변수가 정수 유형의 하위 범위가 아닌 일부 비트 길이의 정수 유형을 정의하므로 (열거 형에 따라 다름)이 작업을 수행 할 수 없습니다. – Lothar

0

역 호환성을위한 특별한 이유가없는 경우, 나는 앞으로의 호환성을 선호합니다. 이 경우 전역 const를 사용하는 것이 더 컴파일러에 독립적이지만 몇 가지 이유로 열거 형에 투표합니다.
1. const는 다른 유형을 가질 수 있습니다. 열거 형을 바꾸려면 검색을 바꾸면됩니다. 예상치 못한 결과를 초래할 수 있습니다 (부호있는/부호없는 및 값 크기 고려). 열거 형에서 단일 유형이 시행됩니다.
2. 강력한 형식의 열거 형은 C++ 0x에 도입되었습니다. 이것에 대한 몇 가지 구현이 이미 C++에서 있습니다.
3. 열거 형, IMHO는 불분명하게 작성하기가 매우 어렵습니다. 당신은 const (여러 파일에 걸쳐 퍼져 있음)에서 그렇게 말할 수 없습니다.

나는 const를 사용하는 경우 클래스 범위 내에서 (전역이 아닌) 정적 const를 사용하는 것을 선호합니다.