클라모듈에는 LPCSTR 인데 왜 서버모듈에는 LPCTSTR 이냐고.
이런 메일 올때마다 자칭 할일 많다고 생각하는 나는 짜증부터 밀려온다.
그냥 대충 쓰면되지 그걸 왜 따지냐고~~~ 라고 맘속으로 몇번이고 중얼중얼 거렸지만
나도 이 둘의 차이가 뭔지 모르는걸.. 대충 썼다는 뜻이지.
그래서 할수없이 네박사님에게 물어봐서 확실하게 개념 을 정립하게 되었다.
먼저 이 타입들 각 문자열이 뜻하는 의미를 알아보자.
L : Long
P : Pointer
C : Constant
T : TCHAR
STR : String
L : Long 은 Pointer 의 범위를 결정한다. 16비트 운영체제에서 명시적으로 지정해주고자 Long(4바이트) 형 포인터라고 지정하는 범위 결정자 이다. short 형 포인트도 물론 있다. 한마디로 32비트 포인트로 동작하라~! 란 뜻이다.
P : 말 그대로 포인터다. 문자열을 전달인자로 넘길때는 당연히 포인터를 써야지 모든 데이터를 넘길수있으므로...
T : 오늘 이넘 때문에 뚜껑열렸던 놈이다. M$ 에서만 그런건지 모든 C++ 에서 그런건지는 모르겠지만 아마도 M$ 에서만 그런것 같다. 표준 API 에서는 명시적으로 char 형과 wchar 형을 나눠놓았는데 M$ 에서는 이것을 통틀어서 TCHAR 으로 정의해놓았다.
그리고 만일 프로젝트가 UNICODE 이면 자동으로 wchar 으로 바뀌고 그렇지 않다면 char 을 쓴다는 뜻이다.
STR : 생략
그럼 LPCSTR 과 LPCTSTR 의 차이를 살펴보자.
1. Multibyte 문자열로 프로젝트를 만든 경우 위 두 타입은 동일하다. 왜냐하면
LPCSTR : [long pointer] const char* <== 이런 타입도 있나몰라. ㅡㅡ;
LPCTSTR : [long pointer] const char*
2. UNICODE 문자열로 프로젝트를 만든 경우는 이 두가지 타입이 다르다.
LPCSTR : [long pointer] const char*
LPCTSTR : [long pointer] const wchar*
그러니 잘 알고 사용하자~! 나처럼 욕먹지말고.