가시고기의 바깥 세상 둘러보기

pelican7.egloos.com

LPSTR, LPCSTR, LPTSTR, LPCTSTR , LPWSTR, LPCWSTR 의 의미

pelican7.egloos.com/1768951
LPSTR, LPCSTR, LPTSTR, LPCTSTR , LPWSTR, LPCWSTR
뭔가 다 비슷 비슷해보이죠?

원래 c와 c++은 string이라는 똑똑한 자료구조형을 compiler차원에서 지원하고 있지 않습니다.

그대신 가장 많이 사용하는 string을 어떻게 저장해야 할지에 대해 고심한 결과...
결국 배열의 끝에 '\0'또는 0 또는 NULL값을 넣어 string을 표현하도록 했습니다.
결국 가장 적은 용량의 string처리와 가장 골치아픈 string처리가 탄생하는 순간이였죠.

어쨌거나 요점은...
Windows에서는 이런 string처리를 위해서 char* 형을 그대로 쓰기 보다는 LPCSTR등의 표현으로 대치해 사용함으로써, 개발의 편의성을 돕고 있습니다.

자... 그럼 서론이 길었고...
위의 골치아픈 형을 살펴보면..

같은 글자들이 여러번 반복해 나옴니다.

LP, C, STR 등이 거의 자주 반복되고,
어떤놈들은 T 나 W를 사용하기도 하죠.

글자를 하나씩 살펴볼까요.

LP는 long pointer를 나타내는 약어로서 16bit시절의 윈도우의 유산입니다.
과거 windows3.1까지의 시절에는 포인터는 모두 16bit였고, 24bit 메모리를 long pointer라는 것을 통해서 extended memory라는 이름으로 관리했었거든요..
현재 LP(long pointer)는 .Net에서는 64bit pointer를, VC++6.0과 그 이전 버전에서는 32bit pointer를 나타냅니다.

C는 constant, 즉 함수의 내부에서 인자값을 변경하지 말라는 뜻입니다.

STR은 말그대로 string자료가 될것이라는 뜻으로 내부적으로는 char형 배열에 null값 종료를 의미하고 있죠.

자... 그럼 해석해 봅시다..
LPSTR = long pointer string = char *
LPCSTR = long pointer constant string = const char *
결과적으로는 맨 마지막과 같은 형이라는 거죠.

그런데...
LPCTSTR!! 요넘은 무었이냐!!
LPCTSTR = long pointer constant t_string = const tchar *
앗! 오타입니다. t라는 놈이 들어갔네요..
오타일까요? ^^ 아닙니다. t라는 놈은 우리나라를 위해 아주 중요한 역할을 하는 놈이죠.. 이것은 잠시 이후에 살펴보겠습니다.

그럼 먼저..
W라는 넘을 살펴보죠...

W 이넘은 wide char를 나타냅니다. 쉽게 말하면 unicode죠..
win9x에서 사용하던 multibyte와는 다릅니다. 물론 한글 조합형 코드도 아니고...
unicode를 나타냅니다.

자 그럼 다시 해석을 해보죠.
LPWSTR = long pointer wide string = w_char *
LPCWSTR = long pointer constant wide string = const w_char *

위와 같이 해석됩니다.


그런데 t_char('티캐릭터'라고 읽습니다.)는 무었이냐!!

마이크로소프트가 세계 각국에 제품을 판매하면서..
각국의 언어에 맞추어 개발하는 것에 환멸을 느끼다가..
드디어 windows를 unicode기반으로 개발하는 작업에 착수했습니다.

그런데... 문제는 char는 1Byte이고 wide char는 2Byte이므로..
포인터 연산을 많이하는 c, c++코드는 호환성에 치명적인 문제가 있었죠.
그래서 컴파일러가 precompile option을 보고. 환경에 맞게 동작하는 코드를 작성할 수 있는 새로운 변수 모양의 Macro를 선언하게 되었습니다.
그것이 바로 TCHAR, t_char라는 변수죠.
이놈들은 자신의 운영체제가 multi-byte환경이면, char형으로,
unicode환경이면, w_char, wide char형으로 type casting됩니다.

그래서... 보통 windows 9x, 2000계열의 환경이라면,
LPTSTR = LPSTR = char *
LPCTSTR = LPCSTR = const char *가 됩니다.

그런데..
아마 저 코드에서..
(LPSTR)(LPCTSTR) 형변환을 할때 자세히 보면..
const 라는 키워드만 떼내는거지요...
그러니까 사실은 (char *)(const char *)와 같은 말입니다.
웃기는 형변환이죠..
그럼 없어도 될까요?
^^

없으면 당연히 오류가 나게됩니다.
왜냐면...(LPSTR)CString을 하면.... CString형 자료의 맨 처음 주소부터 char * 형으로 형변환하기 때문이죠.
CString형은 앞의 16Byte를 자료형을 표현하기 위해서 사용하기 때문에, 여기서부터 형 변환을 해주면 엉뚱한 값이 표현되게 됩니다.

따라서 MFC에서 지원하는 CString class는 LPCTSTR라는 함수를 통해서 일단 안전하게 const char * 형으로 바뀐 자료형을 얻어오게 하는거죠.

CString myString;
(LPCTSTR)myString;이라고 해주면..
myString내부의 string 값을 꺼내오게 도와주는 연산자 또는 함수를 사용하게 된겁니다.
즉 (LPCTSTR)이란 놈이 반환값이 const char* 인 함수입니다.
정확하게 표현하면 operator overloading이라는 거지요.

결과적으로 (LPSTR)(LPCTSTR)myString은
myString의 내부 string 자료를 함수를 통해 자료를 꺼내온뒤에, char* type으로 안전하게 바꾸어주는 역할을 하게 되는 거지요.

참고로, 함수의 인자가 char * 인곳에 const char* 형을 넣으면 컴파일 오류가 발생하기 때문에 (LPSTR)을 한번더 앞에 써주어서 강제 type casting을 한 것입니다. 

덧글

  • 송이 2008/02/27 15:10 삭제 | 답글

    이게 어떻게 이오 공감에...

    한동안 프로그레밍 안보다 보니 머리 아프내요 -_-
  • 네코 2008/02/27 19:13 답글

    얼마전부터 vc8로 mfc 공부하고 있었는데, 이 글 보고서야 이해가 되었네요. ㅠㅠ
  • 류지 2010/04/19 10:44 삭제 | 답글

    퍼갈께요~~
  • 뿡뿡대마왕 2012/08/31 14:20 삭제 | 답글

    우왕..글이 너무 좋네요..ㅋㅋ
    저거 신경안쓰고 살았는데..쉽게 잘 설명해 주셨네요^^
  • 프조 2013/03/11 10:32 삭제 | 답글

    항상 이게 무엇인지 궁금했는데 잘 정리해주셔서 감사합니다
  • 요타바이트 2014/06/05 10:27 삭제 | 답글

    잘보고 갑니다 으리으리 !!
  • 안녕하세요 2014/09/04 10:31 삭제 | 답글

    담아갈게요~~~감사합니다
  • 카무잉 2014/11/10 14:49 삭제 | 답글

    감사합니다. api의 용어들은 이런 의미가 있었군요!!
  • 리스타 2015/01/21 14:17 삭제 | 답글

    링크 퍼갑니다 감사합니다.
  • 스왕 2015/11/26 15:18 삭제 | 답글

    잘보고갑니다 : ) ㅎㅎ
  • 스왕 2015/11/26 15:18 삭제 | 답글

    잘보고갑니다 : ) ㅎㅎ
  • 스왕 2015/11/26 15:18 삭제 | 답글

    잘보고갑니다 : ) ㅎㅎ
  • 스왕 2015/11/26 15:18 삭제 | 답글

    잘보고갑니다 : ) ㅎㅎ
  • 개발자 2015/12/28 11:08 삭제 | 답글

    오래된 글이긴 하지만 감사합니다~ 궁금증이 말끔히 해결됐네요
  • kim 2016/01/14 12:02 삭제 | 답글

    좋은 글 잘 읽었습니다~
  • 초보개발자 2016/03/29 11:22 삭제 | 답글

    감사합니다~~ 변수형 명명에 대한 궁금증을 풀게되어 좋았구요, CString과 LPSTR LPCTSTR과의 관계를 잘 설명해 주셨네요.
  • C코드작성 2016/08/11 11:15 삭제 | 답글

    앞글자만 따서 사용하는 단어들 보면, 항상 전체 이름과 의미가 궁금해서 검색을 하는데, 이글에 딱 궁금했던게 정리되어있네요. 잘보고 갑니다.
  • 치악산 2016/09/10 02:43 삭제 | 답글

    유용한 정보 고맙습니다.
닉네임
비밀번호
블로그
비공개