윈도우 타입 시스템

@codemaru · August 25, 2007 · 5 min read

처음으로 C언어를 익히고 Windows 프로그래밍을 하는 사람들이 겪는 가장 큰 어려움은 복잡한 타입 시스템이다. 대부분의 사람들이 PVOID, LPCTSTR, TCHAR, LPTSTR등으로 전혀 듣지도 못했던 타입 명들 앞에서 당황한다.

하지만 이렇게 괴상하게 보이는 것도 다 몇 가지 기본적인 규칙에 의거해서 만들어져 있기 때문에 그러한 규칙들을 알게 된다면 누구나 쉽게 이해할 수 있고 편하게 사용할 수 있다. 그 규칙이란 것도 특별한 것이 아닌 글자를 통한 축약 형태이다. 여기서는 자주 등장하는 글자들이 의미하는 바를 살펴보고 그것들이 실제로 자주 사용되는 타입 명에서 어떻게 적용되는지 알아보도록 하자. 

글자 의미
T 문자를 나타내는 타입에 주로 등장하는 글자다. T가 의미하는 바는 유니코드와 ANSI의 컴파일 환경에 따라 적절히 변경된다는 것을 나타낸다. 유니코드 빌드라면 wchar_t로 변환되고, ANSI 빌드라면 char로 변환됨을 나타낸다.
L long을 나타낸다. 주로 포인터 타입에 많이 등장한다. 16비트 시절은 포인터가 near, far등으로 구분해서 사용했다. 그 시절 관습에 따라 붙여진 것이다. 32비트 환경에서는 그러한 포인터 사이에 구분이 없기 때문이 L이 붙은 것과 붙지 않은 것 모두 같은 의미를 가진다.
C const를 나타낸다. C가 들어간 자료형은 값을 수정할 수 없는 const로 선언된 것이라 이해하면 된다.
D double을 나타낸다. 크기가 두 배라는 의미다.
U unsigned를 나타낸다.
H 핸들을 나타낸다. 대부분 이 타입은 void *로 변환된다.

그럼 이제 자주 사용되는 타입을 살펴보자. 

타입 명 설명
TCHAR char형을 표현하는 타입이다. T가 붙었기 때문에 유니코드에선 wchar_t로, ANSI에서는 char로 변환된다.
PTSTR,
LPSTR 문자열에 대한 포인터를 나타낸다. 유니코드에선 wchar_t *로, ANSI에서는 char *로 변환된다.
PCTSTR,
LPCTSTR 수정이 불가능한 문자열 포인터를 나타낸다. 유니코드에선 const wchar_t *로, ANSI에서는 const char *로 변환된다.
PVOID void 포인터를 나타낸다. void *로 변환된다.
PCVOID 상수 void 포인터를 나타낸다. const void *로 변환된다.
BOOL TRUE/FALSE를 나타내는데 사용됨을 의미한다. 실제로는 int로 변환된다.
BYTE 8비트 무부호 정수를 나타낸다. unsigned char로 변환된다.
WORD 16비트 무부호 정수를 나타낸다. unsigned short로 변환된다.
DWORD 32비트 무부호 정수를 나타낸다. unsigned long으로 변환된다.
UINT unsigned int로 변환된다.
USHORT unsigned short로 변환된다.
ULONG unsigned long으로 변환된다.
PWORD,
LPWORD,
PUSHORT,
LPUSHORT unsigned short * 변환된다.
HANDLE 파일, 뮤텍스, 세마포어, 이벤트등의 핸들을 나타낸다. void *로 변환된다.
HPEN GDI PEN 핸들이다. void *로 변환된다.
HBITMAP GDI BITMAP 핸들이다. void *로 변환된다.

보다 많은 타입에 대한 더욱 상세한 설명은 아래 페이지에 나와있다.
http://msdn2.microsoft.com/en-us/library/aa505945.aspx

@codemaru
돌아보니 좋은 날도 있었고, 나쁜 날도 있었다. 그런 나의 모든 소소한 일상과 배움을 기록한다. 여기에 기록된 모든 내용은 한 개인의 관점이고 의견이다. 내가 속한 조직과는 1도 상관이 없다.
(C) 2001 YoungJin Shin, 0일째 운영 중