2011-01-07 5 views
26

나는 첫 번째 것을 이해하지만 두 번째 것을 이해합니까? 언제 그리고 왜 그렇게 할 수 있습니까?변수 이름없이 enum 사용

enum cartoon { HOMER, MARGE, BART, LISA, MAGGIE }; 

enum { HOMER, MARGE, BART, LISA, MAGGIE }; 
+4

심슨을 너무 많이 보았을 때 ??? –

+4

그런 건 아니야 .. –

+0

@ 노아 : 아마도 그것이 실제로 불법이며 오해의 소지가 있다고 생각하게 만들었으므로 g ++에 대한 나의 예와 비슷한 테스트를 컴파일했다. 실제로 컴파일 된 온라인 참조는이 구문 옵션을 표시하지 않지만 컴파일되고 실행됩니다. – davka

답변

24

, 예를 들어,

class Encryption { 
public: 
    enum { DEFAUTL_KEYLEN=16, SHORT_KEYLEN=8, LONG_KEYLEN=32 }; 
    // ... 
}; 

byte key[Encryption::DEFAUTL_KEYLEN]; 
+2

이제 어떻게 보았는지/접근했는지 궁금합니다. 그래서 그것을 범위로 가져오고 ClassName :: enum 값을 사용하여이를 사용하므로 기본적으로 enum {blah, hah, lol}은 ClassName :: blah 등을 통해 액세스 할 수 있습니다. 감사. – RoR

6

이 단순히 단순히 int 이외의 유형하지 않고, 각각의 값을 상수 식을 생성, 그래서 당신은 단순히 int을 수락, 당신이 가진 것 아무것도 유형으로 익명 열거를 사용할 수 없으며, 그런 다음 상수와 비교하십시오. 이 같은

뭔가이 같은 대

void doSomething(int c); 

: 그런데

void doSomething(cartoon c); 

, 당신의 구현은 동일 할 것이다 이름이 열거 형의 경우, 유일한 단점 때문에 강한 타이핑입니다.

+0

그들은 실제로 상수가 아니라는 것을 제외하고는 * 상수 표현 *입니다. 때로는 큰 차이가 있습니다. 예를 들어, 참조 또는 주소를 상수로 가져올 수 있습니다. 열거 기호로는 그렇게 할 수 없습니다. –

4

enum, 공용체, 구조체 및 클래스는 구문에서 공통된 부분을 공유합니다. 동일 이 패턴이없는 패턴이 무작위로 사용됩니다. 그러나 언젠가 이것을 발견 할 수 있습니다.

typedef enum { HOMER, MARGE, BART, LISA, MAGGIE } cartoont; 

또는 몇 가지 상태 만 포함하는 단일 변수가있는 경우

enum { HOMER, MARGE, BART, LISA, MAGGIE } my_var; 

이 다음과 같은 선언을 피하십시오.

enum cartoon { HOMER, MARGE, BART, LISA, MAGGIE }; 
cartoon my_var; 
6

두 번째 것은 익명 enum입니다. 필드가 필요할 때 유용 할 수 있지만이 열거 유형의 변수를 선언 할 생각은 없습니다.

:

은 사용의 '매우 C++'예제를 제공하기 위해, 당신은 자주 열거가 지금이 유형의 변수를 선언의 의도없이 '시간의 반환 값을 컴파일'로 사용되는 템플릿 메타 프로그래밍이 본 것
template<class T> 
struct some_metafunction 
{ 
    enum { res = 0; }; 
}; 
당신이 클래스의 기능을 노출 그것을 범위를 제공하는 클래스, 이러한 열거 형을 정의하고, 할 수 있습니다
+0

'= 0;'부분은 실제로 필요한가요? –

+0

@Jacob 그것은 단지 예제 일뿐입니다. (일반적으로'res'의 값은'T'에 달려 있습니다.) – icecrime

2

나는 임베디드 프로젝트에서 만난 anonyous enum의 실제 사용 예제를 제공하고 있습니다. 프로젝트에서 EEPROM은 일부 매개 변수를 저장하는 데 사용됩니다. 이 매개 변수가 카톤 캐릭터의 연령대라고 가정 해 보겠습니다. 각 매개 변수의 크기는 연속 주소에서 1 바이트입니다.

이 매개 변수는 프로세서의 전원이 켜지면 ROM에 저장된 어레이로 복사됩니다.

uint8_t ROM_AGE[END_AGE] 

우리는 여기 anomymous 열거 정의하는 경우 :

enum { HOMER_AGE, MARGE_AGE, BART_AGE, LISA_AGE, MAGGIE_AGE, END_AGE }; 

그런 다음 열거의 핵심 단어는 ROM_AGE[HOMER_AGE] 같은 인덱스에 각 문자의 나이를 사용할 수있다. 이 열거 형을 사용하면 ROM_AGE[0]을 사용하는 것보다 가독성이 훨씬 좋습니다.