IT이야기

C의 기본 열거값이 모든 컴파일러에 대해 동일한가?

cyworld 2022. 5. 16. 21:03
반응형

C의 기본 열거값이 모든 컴파일러에 대해 동일한가?

아래와 같이 열거형을 선언할 때, 모든 C 컴파일러가 기본값을 다음과 같이 설정하였는가?x=0,y=1그리고z=2어떤 기능을 사용할 수 있는지 알아보십시오.

typedef enum {
    x,
    y,
    z
} someName;

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

C99 표준

N1265 C99 초안에는 6.7.2.2/3 "누적 지정자"라고 되어 있다.

=를 가진 열거자는 열거 상수를 상수 식의 값으로 정의한다.첫 번째 열거자에 다음이 없는 경우=, 열거 상수의 값은 0이다.no =를 가진 각각의 후속 열거자는 그 열거 상수를 이전 열거 상수의 값에 1을 추가하여 얻은 상수 식의 값으로 정의한다.(=를 가진 열거자를 사용하면 동일한 열거에서 다른 값을 중복하는 값을 가진 열거 상수를 생성할 수 있다.)

따라서 다음 사항은 항상 적합한 구현을 유지한다.

본시

#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에서 시험하였다.

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

예:

enum months{jan,feb,mar}

설명: 잔의 가치는 0이고, 2월은 1,mar는 2가 될 것이다.

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

설명: 잔의 가치는 123이 될 것이고, 2월은 999가 될 것이고, 마르는 1000이 될 것이다.

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

설명: 잔의 가치는 'a'가 될 것이고, 2월은 's'가 될 것이고, mar는 't'가 될 것이다.

예, 정의 기준 값은 0에서 n번째 요소부터 모든 플랫폼까지입니다.

참조URL: https://stackoverflow.com/questions/6434105/are-default-enum-values-in-c-the-same-for-all-compilers

반응형