---
title: "C enum 크기 문제: MSVC가 또 표준을 무시하는 건에 대하여"
published: 2026-02-23T23:57:12.000Z
canonical: https://jeff.news/article/1140
---
# C enum 크기 문제: MSVC가 또 표준을 무시하는 건에 대하여

C23 enum에서 2³² 이상 값을 쓰면 GCC/Clang은 64비트로 확장하지만, 최신 MSVC는 32비트에 고정되어 값이 0으로 잘림. C23 기저 타입 어노테이션도 미지원.

- C 언어에서 enum의 크기가 컴파일러마다 다르게 동작하는데, **MSVC가 또 표준을 무시**하는 사례 발견

- C23부터 enum에 기저 타입을 명시할 수 있게 됨 (`enum Composer: int { ... }`). 명시하지 않으면 컴파일러가 `char`부터 `long long`까지 알아서 선택 가능한데, 이게 표준 준수 범위 안에 있음

- GCC와 Clang은 정상 동작함. enumerator 값이 2³²-1을 초과하면 자동으로 64비트로 확장. 예를 들어 `VaughanWilliams = 4294967296`(2³²)을 넣으면:
  - GCC/Clang: 값 `4294967296` 출력, 크기 64비트 ✅
  - **MSVC: 값 `0` 출력, 크기 32비트** ❌

> [!WARNING]
> 최신 Visual Studio 2026(MSVC 14.50)에서도 이 문제가 발생함. C23의 기저 타입 어노테이션도 지원하지 않음. "실험적 ISO C23 지원"을 켜도 마찬가지

- 이게 런타임 에러로 이어질 수 있다는 게 진짜 무서운 부분. 값이 조용히 0으로 잘려버리니 디버깅하기 어려운 버그가 됨

- **실용적 대처법**:
  - MSVC를 써야 하면 2³² 이상 값이 필요한 enum 대신 `long long` + 상수를 사용
  - 타입 안전성이 필요하면 값을 감싸는 struct를 고려
  - MSVC 지원하는 C 라이브러리를 쓰고 있다면 모든 enum이 32비트라고 가정해도 무방
  - Rust에서 C FFI 쓸 때는 bindgen이 적절한 `std::ffi::c_xxx` 타입을 잡아줌

## 핵심 포인트

- GCC/Clang은 enumerator 값에 따라 자동으로 64비트 확장
- MSVC 14.50(VS 2026)에서 2³² 이상 값이 조용히 0으로 잘림
- C23 기저 타입 어노테이션을 MSVC가 지원하지 않음
- 대안: long long + 상수 사용, 또는 struct 래핑

## 인사이트

크로스 플랫폼 C 코드를 작성할 때 MSVC의 enum 구현을 절대 신뢰하지 말 것. 특히 Rust FFI에서 bindgen이 타입을 자동으로 잡아주는 것도 참고할 만함.
