열거 형 값 집합을 만들고 있지만 각 열거 형 값의 너비는 64 비트 여야합니다. 내가 정확하게 기억한다면, 열거 형은 일반적으로 int와 크기가 같습니다. 그러나 컴파일러가 적어도 적어도 GCC에서 컴파일러가 값을 보유하는 데 필요한 너비를 열거 형으로 만들 수 있다고 생각했습니다. 그렇다면 64 비트 너비의 열거 형을 가질 수 있습니까?
열거 형 값 집합을 만들고 있지만 각 열거 형 값의 너비는 64 비트 여야합니다. 내가 정확하게 기억한다면, 열거 형은 일반적으로 int와 크기가 같습니다. 그러나 컴파일러가 적어도 적어도 GCC에서 컴파일러가 값을 보유하는 데 필요한 너비를 열거 형으로 만들 수 있다고 생각했습니다. 그렇다면 64 비트 너비의 열거 형을 가질 수 있습니까?
답변:
은 enum
단지 유지에 충분한 보장되는 int
값. 컴파일러는 정의 된 열거 상수를 기반으로 사용되는 실제 유형을 자유롭게 선택할 수 있으므로 사용자가 정의한 값을 나타낼 수있는 경우 더 작은 유형을 선택할 수 있습니다. 적합하지 않은 열거 상수 int
가 필요한 경우 컴파일러 특정 확장을 사용해야합니다.
enum
이보다 크 int
거나 작아야 한다는 제약이 있습니까? @MichaelStum의 답변에 이어 첫 번째 문장은 " 값 enum
에 맞는 것만 보장 int
됩니다"입니다.
enum
단지 열거에서 가장 큰 열거의 값을 보유 할 충분한 보장된다.
현재 C 표준 (C99)에서 발췌 : http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf
6.7.2.2 열거 자 지정자
[...]
제약 조건
열거 상수의 값을 정의하는 식은 정수로 표현할 수있는 값을 갖는 정수 상수 식이어야합니다.
[...]
열거 된 각 유형은 char, 부호있는 정수 유형 또는 부호없는 정수 유형과 호환 가능해야합니다. 유형의 선택은 구현에 따라 정해지지 만 열거의 모든 멤버의 값을 나타낼 수 있어야합니다.
컴파일러가 표준을 따르는 데 능숙하지는 않지만 본질적으로 다음과 같습니다. 열거 형이 int 이외의 것을 보유하고 있다면 심오한 "지원되지 않는 동작으로 인해 1 ~ 2 년 안에 다시 물릴 수 있습니다".
int
short
long
int
하지만 실제 열거 변수는 다른 유형일 수 있습니다. 이것은 표준에서 잘 알려진 불일치입니다.
enum my_enum { my_value }
, my_value
유형이있을 것이다 int
, 그러나 enum my_enum
적어도 모든 열거 값을 나타내야 구현 정의 유형을 가질 수 있습니다. 따라서로 my_value
변환이 좁아 질 수 enum my_enum
있지만 오버플로가 발생하지는 않습니다.
이전 답변은 정확하지만 일부 컴파일러에는 표준을 위반하고 모든 값을 포함하는 가장 작은 유형을 사용하는 옵션이 있습니다.
enum ord {
FIRST = 1,
SECOND,
THIRD
} __attribute__ ((__packed__));
STATIC_ASSERT( sizeof(enum ord) == 1 )
이 코드를 고려하십시오.
enum value{a,b,c,d,e,f,g,h,i,j,l,m,n};
value s;
cout << sizeof(s) << endl;
출력으로 4를 줄 것입니다. 따라서 enum
포함 하는 요소의 수에 관계없이 크기는 항상 고정되어 있습니다.