[MFC] LPSTR,LPCSTR,LPCTSTR .. 과연 무엇인가?

in #kr-dev3 years ago


안녕하세요!! @wonnieyoon입니다.
MFC에는 LPSTR,LPCSTR,LPCTSTR,LPWSTR ... 비슷한게 많습니다.

이러한 것들은 string 처리를 위해 나온 표현인데요.
단어는 다르지만 비슷한 알파벳들이 붙어서 하나의 표현이 되는데
각 단어마다 다른 의미를 가지고 있습니다.

LP
:long pointer의 약자로 컴파일러에 따라 다르지만
.Net의 경우 64bit pointer, 다른 낮은 버전은 32bit pointer를 나타냅니다.

C
: constant의 약자로 변경을 하지 말라는 의미로 사용됩니다.

STR
: STR은 대충 짐작하겠지만
string자료가 될것이고 내부적으로는 char형 배열에 마지막 종료값 null을 가지고 있습니다.

W
:wide char를 나타내고 unicode 입니다.

요약을 해보자면

LPSTR = long pointer string = char *
LPCTSTR = long pointer constant string = const char *

=> const가 있냐 없냐 차이만 있을뿐 LPSTR , LPCTSTR은 같은 형태

LPWSTR = long pointer wide string = w_char *
LPCWSTR = long pointer constant wide string = const w_char *

=> 이것도 const만 빼면 같은 형태

T
: LPCTSTR => long pointer constant t_string = const tchar *
: tchar의 약자

tchar를 알기 위해서는 배경을 알고 있어야 합니다.
마이크로소프트가 제공하는 c 컴파일러 visual studio 기준으로
여러나라에 제품을 팔아야 하는데 나라의 언어에 맞게
개발하기에는 너무 효율성이 떨어진다고 판단하여
unicode 기반으로 개발을 시작했습니다.

그런데 char형식은 1Byte를 사용하고 wide char형식은 2Byte를 사용하기
때문에 호환성의 문제가 많다고 판단하여
컴파일러가 precompile option을 보고 환경에 맞게
컴파일 할수 있도록 변수를 만들게 됩니다.
그것이 바로 t_char(TCHAR) 변수 입니다.

visual studio 속성에서 환경을 멀티바이트로 할것인지 유니코드 기반으로 할것인지
설정할수 있는데 멀티바이트의 경우 char형으로 , 유니코드 기반일 경우 w_char형으로
자동 type casting(형변환)이 됩니다.
요즘은 프로젝트를 만들게 되면 유니코드 기반으로 작업을 하는데
적어도 저같은 경우 증권시스템을 만드는데 회사의 솔루션이 멀티바이트 버전이여서
얼마전에 솔루션을 유니코드 버전으로 바꾸느라 알게된 지식들입니다.

프로젝트 만들때 꼭 유니코드로 만드세요...나중에 유지보수가 너무 힘들어집니다.
멀티바이트에서 유니코드로 바꿀때...엄청난 노가다....ㅠ

MFC는 c,c++ 문법에 기반하다보니
char *을 안쓸수가 없는데 CString을 쓰다보면 아무래도 char *으로 형변환 해야 할때가 있다.
그럴때 (LPSTR)(LPCTSTR)CString 형식으로 사용해야 합니다.
=> 결국 (char *)(const char *)CString 입니다.
이렇게 사용하지 않으면 에러가 납니다.

그런데 사실 const라는것이 괜히 존재하는 것이 아니고 또한 const char *형으로
CString을 받는것도 안정성을 위해 const를 붙여서 받는것인데
const를 제거하기 위해 char *로 다시 변환하게 되면
나중에 코딩을 하다 큰 오류를 일으킬수 있습니다.

그렇기 때문에 보통
CString test = "abc";
char * ch = (LPSTR)(LPCTSTR)test;
AfxMessageBox(ch); 의 형식으로 데이터를 뽑아오지만

아래와 같이 사용하는게 더 안전하다고 합니다.
CString test = "abc";
char * ch = test.GetBuffer(0); //GetBuffer(0) 의미 : test가 가지고 있는 문자열 만큼 가지고 온다
AfxMessageBox(ch);

Sort:  

(jjangjjangman 태그 사용시 댓글을 남깁니다.)
[제 0회 짱짱맨배 42일장]3주차 보상글추천, 1,2주차 보상지급을 발표합니다.(계속 리스팅 할 예정)
https://steemit.com/kr/@virus707/0-42-3-1-2

3주차에 도전하세요

그리고 즐거운 스티밋하세요!