본문 바로가기

Library/C/C++

stdint.h : 이식성을 위한 편리한 존재

C99에서 새롭게 도입된 stdint.h는, 이식성을 염두에 둔다면 자주 써야 할 헤더 파일이다. 기존의 limits.h가 기계 의존적인 자료형의 크기를 정의한 것이라면, stdint.h는 원하는 크기의 자료형을 명확하게 선언한다. limit.h는 기계마다 다른 자료형의 크기만 알려줄 뿐이며, 원하는 크기의 자료형을 선언하는데는 크게 도움이 되지 않는다. stdint.h는 바로 이런 목적을 위해 정의된 것인데, 기존의 short, int, long과 같은 자료형을 보다 명확하게 수치로 나타낸다.

즉, 32 비트 기계에서 16 비트 크기를 가지는 정수 자료형을 명확하게 선언하고 싶다면, int16_t를 사용하고, 32 비트 정수 자료형이라면 int32_t를 사용하여 선언한다. 기본 자료형을 다시 재정의하는 것은 쓸데없이 혼란을 가중시킬거라 생각할지도 모르지만, 이런 식으로 보다 명확하게 자료형을 재정의하는 것은 훨씬 명확한 코드를 작성하는데 도움이 된다. 부동소수점 자료형을 제외한 정수 자료형들은 모두 이런 intN_t 스타일로 정의할 수 있는데, char도 int8_t와 같이 선언할 수 있다. C에서 char 타입은 정수형으로도 간주될 수 있기 때문이다. 자료형의 크기를 명확하게 밝혀준다는 장점 외에도, unsigned int와 같은 긴 문장을 간단하게 uint32_t로 표현할 수 있다는 장점도 있다. 이식성을 염두에 둔 코드를 작성한다면, stdint.h는 매우 편리한 존재가 아닐 수 없다. C99 에서 새롭게 도입된 stdint.h는 C++에도 cstdint 헤더 파일로 포함되어 있다.

왜 이런 것이 필요한지 의아한 사람들을 위해 설명하자면, 표준은 short, int, long 자료형의 크기는 명시적으로 크기를 정의하지 않았기 때문이다. short이 언제나 16 비트라고 정의된 것이 아니며, int 역시 언제나 32 비트라고 정의된 것이 아니다. 다만, short은 최소 int보다 같거나 작아야 한다고 정의되어 있으며, long은 int보다 같거나 커야 한다고 정의되어 있을 뿐이다. 같은 32 비트 환경이라도 ILP32, LP32처럼 다른 데이터 모델을 가지는 컴파일러들이 존재하는 것은 이와 같은 이유 때문이다. stdint.h는 이와 같은 자료형의 크기에 대한 모호성을 제거하여, 이식성 좋은 코드를 작성할 수 있도록 도와준다.

아쉽게도 Visual C++ 8.0, 9.0은 stdint.h를 제공하지 않는다. 최근 릴리즈 된 Visual C++ 10.0(2010)에서는 stdint.h를 사용할 수 있다.