2009-11-30 3 views
3

typedef/enum에 조금 혼란스러워지기 전에는 emun의 이름을 지정할 필요가 없다는 것을 알게되었습니다. typedef와 함께 사용할 때이 두 가지 사이에 차이점이 있습니까? 제 2의 것은 이해하기가 훨씬 쉽습니다.unnamed enum & typedef?

제 1 예 :

typedef enum enumMenuItems { 
    none, 
    add, 
    save, 
    load, 
    list, 
    remove 
} menuItems; 

menuItems optionSelect = none; 

번째 예 :

typedef enum { 
    Earth = 1, 
    Mars, 
    Saturn, 
    Neptune, 
    Jupiter 
} planets; 

planets closest = Mars; 

.

EDIT :

typedef enum enumMenuItems { 
    none, 
    add, 
    save, 
    load, 
    list, 
    remove 
} menuItems; 

따라서 상기 본질적으로 두 가지 유형, 하나 열거라고 enumMenuItems 및 메뉴 아이템이라고 enumMenuItems 번째 타입 정의를 정의한다.

menuItems optionSelect = save; 
enum enumMenuItems optionSelect = save; 

위의 두 선언은 기본적으로 typedef를 사용하고 다른 하나는 enum을 사용하여 동일합니다. 따라서 typedef를 사용하는 경우 typedef menuItem을 통해 유형에 액세스 할 수 있으므로 열거 형을 그대로 사용할 수 있습니다.

게리

+0

나는 당신의 편집에 약간 혼란 스럽지만 레이아웃은 스타일/개인 취향의 문제가 아니라? – fuzzygoat

+0

물론, 열거 형의 선언과 사용간에 차별화를 원한다. NBD. –

+0

편집 내용의 주석이 기본적으로 정확합니다. 의미 론적 변명이 있지만 실제로는 중요하지 않다고 생각합니다. –

답변

5

첫 번째 경우는 enum enumMenuItems로 형식을 참조 할 수 있습니다. 예를 들면 :

enum enumMenuTimes optionSelect = none; 

두 부분으로 그것을 무너 뜨리는 경우가 명확 수 있습니다 :

enum _planets { 
    Earth = 1, 
    Mars, 
    Saturn, 
    Neptune, 
    Jupiter 
}; 
typedef enum _planets planets; 

enum _planets planet1 = Earth; 
planets  planet2 = Mars; 

을하는 당신을 위해 개념을 단순화합니다. 두 번째 표기법은 바로 속기입니다. 익명 열거 형을 만들고 typedef을 사용하여 이름을 지정합니다. 당신은, 예를 들어, 할 수있는 :

enum { 
    Value0, 
    Value1, 
    Value2 
}; 

하지만 당신은 당신이해야 할 노력하고있는 것처럼, 가짜 형 이름으로 열거를 사용할 수 없습니다 것입니다. 그래도 열거 된 값에 액세스 할 수 있습니다.

자세한 내용은 comp.lang.c FAQ에서 확인할 수 있습니다.