본문 바로가기
TIL/C++

데이터 타입 크기와 signed/unsigned 체크 방법

by DandyU 2014. 12. 16.

1. 아래의 코드를 헤더 파일에 정의하고

 

#if !defined(DC__TEST_TYPE_SIZE)

#define DC__TEST_TYPE_SIZE(_type, _size) \

        typedef int DC__TEST_TYPE_SIZE_##_type[(sizeof(_type) == (_size)) ? 1 : -1]

#endif

 

#if !defined(DC__TEST_TYPE_IS_SIGNED)

#define DC__TEST_TYPE_IS_SIGNED(_type) \

        typedef int DC__TEST_TYPE_IS_SIGNED_##_type[((_type)((_type)1 << ((sizeof(_type) * 8) - 1)) < 0) ? 1 : -1]

#endif

 

#if !defined(DC__TEST_TYPE_IS_UNSIGNED)

#define DC__TEST_TYPE_IS_UNSIGNED(_type) \

        typedef int DC__TEST_TYPE_IS_UNSIGNED_##_type[((_type)((_type)1 << ((sizeof(_type) * 8) - 1)) > 0) ? 1 : -1]

#endif

 

 

2. 테스트할 데이터 타입을 다음과 같이 선언하면 컴파일하면서 조건에 맞지 않으면 컴파일 에러가 난다.

(unsigned 경우 DC__TEST_TYPE_IS_UNSIGNED() 매크로를 사용하면 된다.)

 

DC__TEST_TYPE_SIZE(DC_LONG, 4);

DC__TEST_TYPE_IS_SIGNED(DC_LONG);

 

 

3. 주의할 점은 반드시 공백 없이 이어진 C identifier 조건에 부합되는 문자열이어야 한다.

위 매크로를 사용해 “char *”, “struct xxx” 등과 같은 값은 사용할 수 없다.

이런 것까지 사용하려면 typedef 로 선언한 심볼이 충돌할 가능성이 높아지지만 ##_type 를 사용하지 않도록

DC__TEST_* 들을 수정하거나 또는 “typedef char *PCHAR;”, “typedef struct xxx XXX;” 처럼 한 단어로 바꿔 테스트하면

된다.

 

'TIL > C++' 카테고리의 다른 글

화면 크기에 맞는 영상 크기 구하기  (0) 2015.01.23

댓글