괴짜 프로그래머의 일상사~@@
프로그래밍, 컴퓨터, 그리고 일상에 관한 소소한 이야기들...
Blog | Guestbook
Keyword | Local | Tag
T 103 / Y 700 / Total 3405161
Catergories
Calendar
«   2023/06   »
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30  
Tag
휴대폰, Assembly, 호로비츠를 위하여, 웨딩 크래셔, 상대 평가, nProtect, 오피스 2007, 포세이돈, 스페이스 니들, 죽음, 일 잘하는 법, 후지쯔, 퍼즐 메이커, 존 카맥, YAG, 공지영, 아인슈타이, 테스트, 펜팔, 러브홀릭,
Archive
Link
Search
  submit
Recent Articles
Recent Comments
Recent Trackbacks
2007/08/25 12:13
윈도우 타입 시스템

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

Trackback : http://jiniya.net/tt/trackback/577
최재훈 (2007/08/25 13:42)
참 복잡하긴 합니다. VC++을 다뤄본 경험이 아직 부족해서 그렇겠지만, 여전히 모르는 게 많습니다.
codewiz (2007/08/26 12:34)
네. 저도 처음 윈도우 프로그래밍을 할 때 사소한 것들 때문에 애를 먹었던 기억이 납니다. 돌아보면 아무거도 아닌데 그 때는 왜 그렇게 헤맸는지 ㅎㅎ

풀리비 (2007/08/27 00:15)
전에 Visual C++ 팀 블로그에 컴파일러 팀의 어떤 사람이 header guard에 대한 생각을 적었습니다. 댓글 중에 이런 게 있었습니다.

" 그 많은 #define 매크로들이나 정리해라! "

ㅋㅋㅋ Visual C++의 버전이 8까지 나오면서 (코드명 orcas라 불리는 9가 이미 베타까지 나왔더군요) 잘 사용 안하는 옛날의 많은 매크로 정의들이 아직까지 호환성이라는 미명하에 남아 있어 난감합니다. 새로운 매크로 정의하는 데도 문제가 있구요. 또 플랫폼SDK와 MFC에서 서로 다른 것을 쓰는 것도 있구요..
문자열 정의하는 데 쓰는 것도 _T(), _TEXT, TEXT() 등 이 있지요.. 좀 짜증납니다.. 싹 갈아치우고 깔끔하게 정리한 Visual C++도 따로 발표했으면 좋겠습니다.
codewiz (2007/08/27 10:56)
네 맞는 말씀입니다.
지금 윈도우 헤더는 너무나 복잡하죠.
오죽하면 WIN32_LEAN_AND_MEAN 따위를 만들었겠습니다.

그런데 또 한편으로 MS 입장을 이해하지 않을 수 없는건 그것에 칼을 댈 경우 멀쩡하게 잘 동작하던 수많은 코드가 컴파일되지 않을 것이기 때문이죠. 실제로 아주 사소한 UI 변화에도 좋아하는 개발자가 있는 반면, 기존것과 같지 않다고 불평하는 개발자들이 있습니다. 그런 개발자들에게 정리라는 미명하에 기존의 개발자 코드를 고치라고 했을 때 결과는 불보듯 뻔하죠. 또한 이제껏 MS가 버틸수 있었던 가장 큰 근간이 철저한 하위호환성이란 점을 생각해볼때 쉽게 고치긴 힘든 문제인 것 같습니다.

welding companies in miami fl (2021/11/29 23:12)
Well this is great site! Would definitely recommend this to my friends. Love the read

Name   Password   Home   Secret   Submit
 Prev   1  ...  142   143   144   145   146   147   148   149   150  ...  604   Next 
codewiz’s Blog is powered by Tattertools.com / Designed by faido