2012-07-09 3 views
2

비트 마스크로 값을 사용하는 것처럼 영리한 작업을 수행하지 않는다면 컴파일러에서 열거 형 상수에 할당 할 값을 선택하도록해야합니다. 좀 더 명확한 코드 문서에 대한 열거 형 값을 사용하는 중이라면 모든 값을 명시 적으로 정의하지 않으면 오싹해질 수있는 문제가 있습니까? 나는 값들이 오름차순으로 할당되어 있다고 믿는다. 연속되는 각 컴파일에 대해 동일한 값을 유지하도록 첫 번째 값을 정의해야합니까?명시 적으로 값을 정의해야합니까? 열거 형 상수

C99에서

답변

4

유형의 사용에 따라 달라질 것이라고 생각합니다. 쉽게

  • 추가하고 개발로 값을 제거하기 :

    장점 enum 초기화를 제공하지합니다.

  • 실수로 같은 값을 가진 두 개의 식별자를 정의하지 않을 것입니다. enum 초기화를 제공하는

장점 :

  • 안전 직렬화 데이터를 역 직렬화하는. 이 값들을 파일, 네트워크 소켓 등에 넣어야한다면, 나는 값을 쓸 것이다.
  • 디버깅 목적으로 값을 쉽게 볼 수 있습니다.
5

, 제 6.7.2.2p3 :

열거 목록의 식별자는 int 형이 등이 허용되는 곳 가 나타날 수 상수로 선언된다. =가있는 열거자는 열거 형 상수를 상수 식의 값으로 정의합니다. 첫 번째 열거 자의 값이 =이 아닌 경우 해당 열거 형 상수 값은 0입니다. no = 이있는 각 후속 열거자는 에서 얻은 상수 식의 값으로 열거 형 상수를 정의하고 이전 열거 상수의 값에 1을 더합니다. ( =으로 열거의 사용은 같은 열거에서 다른 값을 중복 값을 열거 상수를 생성 할 수 있습니다.)

첫 번째 열거에 값을 할당 할 필요가있는 유일한 시간입니다 당신이 그 값을 원하는 경우 0과 달라야합니다. 일반적으로 열거자를 사용하여 배열을 인덱싱하는 경우가 많기 때문에 그렇게하지 않을 것입니다.

다음은 "이전 값에 1을 더하는"간단한 예제입니다.

enum { 
    A, 
    B, 
    C = 0, 
    D, 
    E 
}; 

int main() 
{ 
    printf("%d\n", A); 
    printf("%d\n", B); 
    printf("%d\n", C); 
    printf("%d\n", D); 
    printf("%d\n", E); 
    return 0; 
} 

위의 프로그램의 출력은 다음과 같습니다

0 
1 
0 
1 
2 

유일한 "잡았다"나는 여러 enum 이름이 같은 값을 표시하려는 경우, 당신이 기억해야한다는 것입니다 생각할 수 별칭 옆에있는 항목이나 enum 목록의 맨 아래에 막대기를 붙입니다. 후자를 선호하므로 enum 값을 예측하기 위해 enum 행을 계산할 수 있습니다.

enum { 
    A, 
    B, 
    E, 

    /* aliases below */ 
    C = A, 
    D = B 
}; 

그렇지 않으면 열거자는 int 리터럴과 같습니다.

+0

마지막 구문을 사용하면 괜찮습니다. 'const int'가 아닙니다. 그것은 객체가 아니며 주소도없고 컴파일시 정수 상수 표현입니다. –

+0

@ JensGustedt :'const int'는 "int int 형"상수라고 말한 곳에서 인용 한 표준 단락에서 왔지만 당신이 잘못 해석 한 것이 옳습니다. 나는 형을 편집하고, 안부를 전한다. – jxh