처음으로 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