C++ enum 값은 32비트 정수인가?

  • Post author:
  • Post category:
  • Post comments:0 Comments
  • Post last modified:April 21, 2009

앞서 언급한 이상한 정수 캐스팅 상황과 관련이 있는 일이다. C#과 C++ 둘다 쓰는 32비트 정수값이 있다. 간단히 설명하자면 Enum을 쓸 자리에 어떤 사연이 있어서 C#쪽에선 int를 나열하고 C++에선 enum을 이용했다. 그런데 이 값의 최대값까지 들어찬 상황이라 64비트 정수로 바꾸게 됐다.

여기서 문제는 ‘C++ enum의 내부 표현이 어떻게 되느냐’다. 여태 int라고 알았기에 __int64짜리 enum을 어떻게 구현하느냐 고민하게 됐다. 처음엔 C#처럼 해보았다. 이런 식으로,

enum MY_ENUM : unsigned __int64
{
    LARGE_VALUE = 0x1000000000000000,
};

그러나 컴파일이 될리 없었다. 이런 코드는 C4480 컴파일러 경고를 내뱉는다.

비표준 확장이 사용되었습니다. ‘enum’ 열거형에 대해 내부 형식을 지정합니다.

nonstandard extension used: specifying underlying type for enum ‘enum’

대충 알아본 바론 위의 코드는 차기 C++ 표준이던가 표준이 될 가능성이 높다고 한다. 그러나 현재로선 표준이 아니기 때문에 경고가 나는 것이다. VC++ 컴파일러가 이 비표준 기능을 지원하긴 하지만 나로선 되도록 표준만 고집할 생각이었다.

혹자는 C++ enum이 64비트 정수를 알아서 처리해준다고 하더라. 그래서 검증해보았다.

enum EnumMock
{
	ENUM_MOCK_LARGE_VALUE = INT_MAX+1
};

이랬더니 바로 오류 난다.

warning C4307: ‘+’ : 정수 계열 상수 오버플로입니다.

헛소리였다. C++ enum은 32비트 정수일 뿐이다. 결국 이 기존 enum 값을 모두 64비트 정수로 나열해 표현했다. 더 좋은 방법이 있으려나?

참고

Kubernetes, DevSecOps, AWS, 클라우드 보안, 클라우드 비용관리, SaaS 의 활용과 내재화 등 소프트웨어 개발 전반에 도움이 필요하다면 도움을 요청하세요. 지인이라면 가볍게 도와드리겠습니다. 전문적인 도움이 필요하다면 저의 현업에 방해가 되지 않는 선에서 협의가능합니다.
follow me
  • 일이든 소셜이든 잠시 숨을 고르고 멈춰서 둘러보면 산으로 가는 일이 비일비재하다.
    1 day ago
  • 최선의 노력을 투입해 거대한 쓰레기를 내놓는다던가, 차라리 조금 더 망설이며 천천히 했으면 계곡 깊숙히 차를 쳐박기 전에 돌아나오기라도 했을텐데 문제를 제기한 배경을 이해하고 진짜 문제가 맞는지 의심해보지… https://t.co/naZX8nGkVZ
    1 day ago
  • 세상에 똑똑한 친구가 참 많은데 현명한 친구는 또 그렇지 않단 말이지. 문제가 있으면 그 문제를 잘 분석해서 최적화하고 그럴 듯한 보고서든 실물이든 잘 만든다. 그런데 전제와 가정을 주의깊게 안 보니 실은… https://t.co/2PS5SU1mJl
    1 day ago
Buy me a coffeeBuy me a coffee
×
Kubernetes, DevSecOps, AWS, 클라우드 보안, 클라우드 비용관리, SaaS 의 활용과 내재화 등 소프트웨어 개발 전반에 도움이 필요하다면 도움을 요청하세요. 지인이라면 가볍게 도와드리겠습니다. 전문적인 도움이 필요하다면 저의 현업에 방해가 되지 않는 선에서 협의가능합니다.
Latest Posts