[c] C에서 열거 형의 크기는 얼마입니까?

열거 형 값 집합을 만들고 있지만 각 열거 형 값의 너비는 64 비트 여야합니다. 내가 정확하게 기억한다면, 열거 형은 일반적으로 int와 크기가 같습니다. 그러나 컴파일러가 적어도 적어도 GCC에서 컴파일러가 값을 보유하는 데 필요한 너비를 열거 형으로 만들 수 있다고 생각했습니다. 그렇다면 64 비트 너비의 열거 형을 가질 수 있습니까?



답변

enum단지 유지에 충분한 보장되는 int값. 컴파일러는 정의 된 열거 상수를 기반으로 사용되는 실제 유형을 자유롭게 선택할 수 있으므로 사용자가 정의한 값을 나타낼 수있는 경우 더 작은 유형을 선택할 수 있습니다. 적합하지 않은 열거 상수 int가 필요한 경우 컴파일러 특정 확장을 사용해야합니다.


답변

현재 C 표준 (C99)에서 발췌 : http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf

6.7.2.2 열거 자 지정자
[…]
제약 조건
열거 상수의 값을 정의하는 식은 정수로 표현할 수있는 값을 갖는 정수 상수 식이어야합니다.
[…]
열거 된 각 유형은 char, 부호있는 정수 유형 또는 부호없는 정수 유형과 호환 가능해야합니다. 유형의 선택은 구현에 따라 정해지지 만 열거의 모든 멤버의 값을 나타낼 수 있어야합니다.

컴파일러가 표준을 따르는 데 능숙하지는 않지만 본질적으로 다음과 같습니다. 열거 형이 int 이외의 것을 보유하고 있다면 심오한 “지원되지 않는 동작으로 인해 1 ~ 2 년 안에 다시 물릴 수 있습니다”.


답변

이전 답변은 정확하지만 일부 컴파일러에는 표준을 위반하고 모든 값을 포함하는 가장 작은 유형을 사용하는 옵션이 있습니다.

GCC를 사용한 예 ( GCC 매뉴얼 문서 ) :

enum ord {
    FIRST = 1,
    SECOND,
    THIRD
} __attribute__ ((__packed__));
STATIC_ASSERT( sizeof(enum ord) == 1 )


답변

열거 형의 마지막 값을 열거 형을 원하는 크기로 만들 수있을만큼 큰 값으로 설정하면 크기가 같아야합니다.

enum value{a=0,b,c,d,e,f,g,h,i,j,l,m,n,last=0xFFFFFFFFFFFFFFFF};


답변

enum변수 의 크기는 제어 할 수 없습니다 . 그것은 구현에 전적으로 달려 있으며, 컴파일러는를 사용하여 정수의 이름을 저장하는 옵션을 제공 enum하므로 정수 enum의 크기를 따릅니다.


답변

C 언어에서는 enum의 크기가 보장됩니다 int. 컴파일 시간 옵션 ( -fshort-enums)이 짧아집니다 (이 값이 64K 이하인 경우 주로 유용합니다). 크기를 64 비트로 늘리는 컴파일 시간 옵션이 없습니다.


답변

이 코드를 고려하십시오.

enum value{a,b,c,d,e,f,g,h,i,j,l,m,n};
value s;
cout << sizeof(s) << endl;

출력으로 4를 줄 것입니다. 따라서 enum포함 하는 요소의 수에 관계없이 크기는 항상 고정되어 있습니다.