2008-08-30 4 views
4

C에서 typedef 열거 형에 대한 추가 데이터를 정의하는 최선의 방법은 무엇입니까?C에서 typedef 열거 형에 대해 미리 정의 된 데이터 추가

예 :

typedef enum { 
    kVizsla = 0, 
    kTerrier = 3, 
    kYellowLab = 10 
} DogType; 

지금은 "인 Vizsla"이어야합니다 예를 kVizsla를 들어, 각각의 이름을 정의하고 싶습니다. 현재 큰 스위치 블록을 사용하여 문자열을 반환하는 함수를 사용하고 있습니다.

답변

2

@dmckee : 나는 제안 된 솔루션 (훌륭하지만 간단한 데이터에 대한 생각 등 이름 만있는 경우 필요한 경우) 자동 생성 코드로 보강 할 수 있습니다. 코드를 자동 생성하는 방법은 많이 있지만, 간단한 방법으로 열거 형의 XML 표현을 가져 와서 코드 파일을 출력하는 간단한 XSLT를 작성할 수 있다고 생각합니다.

<EnumsDefinition> 
    <Enum name="DogType"> 
     <Value name="Vizsla" value="0" /> 
     <Value name="Terrier" value="3" /> 
     <Value name="YellowLab" value="10" /> 
    </Enum> 
</EnumsDefinition> 

을하고 결과 코드는 자신의 솔루션에 제안 dmckee 것과 비슷한 것 :

XML은 형식이 될 것입니다.

XSLT를 작성하는 방법에 대한 정보는 here을 시도하거나 Google에서 검색하여 적합한 자습서를 찾으십시오. XSLT를 작성하는 것은 그다지 즐거운 IMO는 아니지만, 적어도 이와 같은 비교적 단순한 작업에서는 그리 나쁘지 않습니다.

0

개방형 질문이지만, 한 가지 제안은 enum을 키 유형으로 사용하고 값에 추가 정보가있는지도를 사용하는 것입니다. (인덱스가 연속적인 경우, 예와 달리 맵 대신 시퀀스 컨테이너를 사용할 수 있습니다.)

1

열거 형 값이 충분히 빽빽한 경우 문자열을 보유 할 배열을 정의한 다음이를 찾은 다음 건너 뛴 값에 NULL을 사용하고 조회 루틴에 특수 사례 처리기를 추가 할 수 있습니다.

char *DogList[] = { 
    "vizsla", /* element 0 */ 
    NULL, 
    NULL, 
    NULL, 
    "terrier", /* element 3 */ 
    ... 
}; 

이렇게하면 스파 스 열거에 비효율적입니다.

열거 형이 빽빽하지 않더라도 매핑을 유지하기 위해 구조체 배열을 사용할 수 있습니다.

typedef struct DogMaps { 
    DogType index; 
    char * name; 
} DogMapt; 
DogMapt DogMap[] = { 
    {kVizsla, "vizsla"}, 
    {kTerrier, "terrier"}, 
    {kYellowLab, "yellow lab"}, 
    NULL 
}; 

두 번째 접근 방식은 매우 유연하지만 데이터를 사용해야 할 때마다 매핑을 통한 검색을 의미합니다. 큰 데이터 세트의 경우 배열 대신 b- 트리 또는 해시를 고려하십시오.

두 가지 방법 모두 일반화하여 더 많은 데이터를 연결할 수 있습니다. 첫 번째에서는 구조체의 배열을 사용하고 두 번째 구조체에서는 구조체에 멤버를 더 추가합니다.

물론 이러한 데이터 구조와의 상호 작용을 단순화하기 위해 다양한 핸들러를 작성하고자합니다.


@Hershi 모든 코드와 데이터를 분리하십시오. 위의 예는 기능적 이라기보다는 명확한 의미입니다.

당신이 보여주는 구조화 된 입력이 아닌 공백으로 분리 된 플랫 파일을 여전히 사용하고 있음을 인정하지만 필자의 프로덕션 코드는 가능한 한 많은 외부 소스의 데이터를 읽습니다.


잠깐, 코드 생성을 의미하는 것으로 보입니다.

확실히. 그게 잘못된 것은 아닙니다.

나는 생각한다, ... 영업 이익은 생성 된 코드가 어떻게 보일지에 관심이 있다고 생각

3

X() macros에 가장 적합합니다. 이러한 유형의 매크로는 C 전 처리기를 사용하여 동일한 소스에서 열거 형 및 배열을 구성 할 수 있습니다. X() 매크로를 포함하는 #define에 새 데이터를 추가하기 만하면됩니다.

귀하의 예는 같이 쓸 수있다

은 다음과 :

// All dog data goes in this list 
#define XDOGTYPE \ 
    X(kVizsla,0,"vizsla") \ 
    X(kTerrier,3,"terrier") \ 
    X(kYellowLab,10,"yellowlab") 

// Dog info 
typedef struct { 
    int val;  // Defined value 
    char * desc; // Text description 
} DogType; 

// Build an array index using the Names 
typedef enum { 
    #define X(Name,Val,Text)  Name, 
    XDOGTYPE 
    #undef X 
    MAXDOGS 
} DogIndex; 

// Build a lookup table of values 
DogType Dog[] = { 
    #define X(Name,Val,Text) {Val,Text}, 
    XDOGTYPE 
    #undef X 
}; 

// Access the values 
for (i=0; i < MAXDOGS; i++) 
    printf("%d: %s\n",Dog[i].val,Dog[i].desc); 
관련 문제