2013-03-27 2 views
1

C에서 테이블의 크기가 가장 큰 문자열 리터럴을 찾고 있습니다. 요점은 컴파일러에서 sizeof ("Some String Literal") 컴파일 시간 동안.테이블에 크기가있는 문자열 리터럴 구현

지금까지 나는 다음과 같은 두 가지 가능성을 생각할 수 있습니다 (아래 코드 참조)

  1. 입력 문자열을 두 번 옵션 A.에 대해 수행으로이 있기 때문에 가능한 입력 오류의 좋은 해결책이되지 않는 경우가 많은 문자열이며 문자열을 변경해야합니다.

  2. 는 문자열 리터럴을 정의하고 옵션 B

으로 수행 또는 더 우아한 해결책이 있기 때문에 다음 표에 다음을 사용할 수 있습니까?

#define STR_OPTION_B "Option B" 

typedef struct 
{ 
    enum { 
     OPTION_A, 
     OPTION_B 
    } optionIDs; 
    char* pString; 
    int sizeOfString; 
} 
tTableElement; 

tTableElement table[] = 
{ 
    { OPTION_A, "Option A", sizeof("Option A") }, 
    { OPTION_B, STR_OPTION_B, sizeof(STR_OPTION_B) } 
}; 
+0

당신이 우아 무엇을 생각 하는가? – Mike

+0

친절하고 구현하기 쉽고 읽기 쉽습니다. – Anguel

답변

5

#define 매크로를 사용하면 문자열과 문자열 크기를 구조에 넣을 수 있습니다.

#define STR_ENTRY(x) x, sizeof(x) 
tTableElement table[] = 
{ 
    { OPTION_A, STR_ENTRY("Option A") }, 
    { OPTION_B, STR_ENTRY("Option B") } 
}; 
#undef STR_ENTRY 

이 문자 그대로 확장해야합니다

tTableElement table[] = 
{ 
    { OPTION_A, "Option A", sizeof("Option A") }, 
    { OPTION_B, "Option B", sizeof("Option B") } 
}; 
+0

매우 감사합니다. – Anguel

+0

매크로의 수명이'# undef'로 인해 제한되어 있지만, 대문자로 된 뒤에는 선행 밑줄로 시작하는 이름은 피해야합니다. – jamesdlin

+3

@abelenky : 앞에 밑줄을 붙이고 대문자 또는 다른 밑줄로 시작하는 모든 식별자는 모든 범위에 예약되어 있습니다. 선행 밑줄이있는 식별자는 전역 범위에서 예약됩니다. (http://stackoverflow.com/questions/228783/what-are-the-rules-about-using-an-underscore-in-a-c-identifier 참조) – jamesdlin