C의 기본 열거 형 값은 모든 컴파일러에서 동일합니까?


107

아래 그림과 같이 열거를 선언 할 때, 모든 C 컴파일러는 기본 값을 설정하는 x=0, y=1그리고 z=2모두 리눅스와 윈도우 시스템을?

typedef enum {
    x,
    y,
    z
} someName;

3
네, 그것은 표준에 의해 요구되며 누군가가 그것들을 인용 할 수있을 것이라고 확신합니다.
니모

답변:


115

예. 열거 정의에서 달리 지정하지 않는 한 초기 열거 자의 값은 항상 0이고 각 후속 열거 자의 값은 이전 열거 자보다 1이 큽니다.


14
그리고이 동일한 동작은 C와 C ++ 모두에서 필요합니다. C ++에서는 [dcl.enum]"첫 번째 열거 자에 이니셜 라이저가 없으면 해당 상수의 값은 0입니다. 이니셜 라이저가없는 열거 자 정의는 이전 열거 자의 값을 1 씩 증가시켜 얻은 값을 열거 자에 제공합니다."
Ben Voigt 2011-06-22

3
예, C #과 같이 문자 C로 시작하는 다른 언어도 있습니다.
James McNellis 2011-06-22

70

C99 표준

N1265 C99 초안 6.7.2.2/3 "열거 지정자"에서 말한다

=가있는 열거자는 해당 열거 상수를 상수 식의 값으로 정의합니다. 첫 번째 열거 자에 no가 있으면 =해당 열거 상수 값은 0입니다. =가없는 각 후속 열거자는 이전 열거 상수 값에 1을 더하여 얻은 상수 식의 값으로 열거 상수를 정의합니다. (=과 함께 열거자를 사용하면 동일한 열거에서 다른 값을 복제하는 값이있는 열거 상수가 생성 될 수 있습니다.)

따라서 다음은 항상 준수 구현을 유지합니다.

main.c

#include <assert.h>
#include <limits.h>

enum E {
    E0,
    E1,
    E2 = 3,
    E3 = 3,
    E4,
    E5 = INT_MAX,
#if 0
    /* error: overflow in enumeration values */
    E6,
#endif
};

int main(void) {
    /* If unspecified, the first is 0. */
    assert(E0 == 0);
    assert(E1 == 1);
    /* Repeated number, no problem. */
    assert(E2 == 3);
    assert(E3 == 3);
    /* Continue from the last one. */
    assert(E4 == 4);
    assert(E5 == INT_MAX);
    return 0;
}

컴파일 및 실행 :

gcc -std=c99 -Wall -Wextra -pedantic -o main.out main.c
./main.out

Ubuntu 16.04, GCC 6.4.0에서 테스트되었습니다.


7

열거 형 변수의 첫 번째 값이 초기화되지 않은 경우 C 컴파일러는 자동으로 값 0을 할당합니다. 컴파일러는 선행 열거 형 변수의 값을 1 씩 계속 증가시킵니다.

예 :

enum months{jan,feb,mar}

설명 : 1 월의 값은 0, 2 월은 1, 3 월은 2입니다.

enum months{jan=123,feb=999,mar}

설명 : jan의 값은 123, feb은 999, mar는 1000입니다.

enum months{jan='a',feb='s',mar}

설명 : jan의 값은 'a', feb은 's', mar는 't'입니다.


1
3 월 't'은 보장되지 않습니다. 문자가 연속적인 알파벳 순서가 아닌 문자 세트가있을 수 있습니다
MM

-15

예, enum value bydefult는 모든 플랫폼에 대해 0부터 n 번째 요소까지 시작합니다.


14
귀하의 답변이 답변 풀에 어떻게 추가되는지 고려하십시오. 즉, 새로운 답변 (5 년 후)이 다른 답변에서 다루지 않는 새로운 것을 어떻게 추가합니까? 언뜻보기에 다른 두 답변보다 정보가 덜한 것 같습니다.
LawfulEvil

2
@LawfulEvil 진정해. 여러 답변은 사람들이 미래에 이것을보고 여러 관점을 제공합니다. 즉, 이것은 형식이 잘못되어 유익하지 않은 답변이지만 그 자체로 충분한 답변은 나쁘지 않습니다.
Kenny Worden
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.