C에서 열거형의 크기는 얼마인가?
열거형 값 집합을 만들고 있지만 각 열거형 값의 너비가 64비트여야 해.내가 정확히 기억한다면 열거형은 일반적으로 int와 같은 크기지만, 컴파일러는 (적어도 GCC에서) 그들의 가치를 유지하기 위해 필요한 모든 폭을 열거할 수 있다는 것을 어디서 읽었다고 생각했다.그렇다면 64비트 폭의 열거형이 가능할까?
현재 C 표준(C99): http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf
6.7.2.2 열거 지만자
[...]
열거 상수의 값을 정의하는 식은 int로 나타낼 수 있는 값을 갖는 정수 상수 식이어야 한다.
[...]
열거된 각 형식은 char, 서명된 정수 형식 또는 서명되지 않은 정수 형식과 호환되어야 한다.유형 선택은 구현 정의되지만 열거형 구성원의 모든 값을 나타낼 수 있어야 한다.
그러한 컴파일러가 표준을 따르는 데 전혀 능하지 않지만, 본질적으로 다음과 같다.만약 당신의 열거자가 int가 아닌 다른 것을 가지고 있다면, 당신은 깊은 "지원받지 못하는 행동"에 빠지고 1, 2년 후에 당신을 물게 될 것이다.
업데이트: C Standard(C11)의 최신 공개 초안: http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1570.pdf에는 동일한 조항이 포함되어 있다.따라서 이 대답은 여전히 C11을 고수한다.
안enum
단지 충분히 큰 것이 보장되어 있다.int
가 할 수 , 수 더 할 수 있다컴파일러는 정의한 열거 상수에 기초하여 사용하는 실제 유형을 자유롭게 선택할 수 있으므로 사용자가 정의한 값을 나타낼 수 있는 경우 더 작은 유형을 선택할 수 있다. 이 에 하다면, 은 수정이 가능하다.int
그렇게 하려면 컴파일러별 확장을 사용해야 한다.
앞의 답이 맞지만, 일부 컴파일러는 표준을 깨고 모든 값을 포함하는 가장 작은 유형을 사용하는 옵션을 가지고 있다.
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
A의 크기가 보장된다.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
그 크기는 항상 고정되어 있다.
참조URL: https://stackoverflow.com/questions/366017/what-is-the-size-of-an-enum-in-c
'programing' 카테고리의 다른 글
Vuex 상태에서 Vue 라우터를 사용하는 방법? (0) | 2022.05.02 |
---|---|
bootstrap-vue: 특정 css 가져오기 (0) | 2022.05.02 |
Vue js 호출 동작 내부 동작 (0) | 2022.05.02 |
Java 파일 크기 가져오기 (0) | 2022.05.02 |
서명되지 않은 정수 오버플로가 정의된 동작은 정의되지만 서명된 정수 오버플로는 정의되지 않는 이유는? (0) | 2022.05.02 |