IT_Programming/MFC · API

[펌] LPSTR, LPCSTR, LPTSTR, LPCTSTR, LPWSTR,LPCWSTR 의미

JJun ™ 2009. 4. 8. 12:00

 

출처: http://mygeni.tistory.com/58 

 

LPSTR, LPCSTR, LPTSTR, LPCTSTR, LPWSTR,LPCWSTR 의 의미는 다음과 같다


원래 C와 C++은 string 이라는 똑똑한 자료구조형을 Compiler 차원에서 지원하고 잇지 않습니다

그대신 가장 많이 사용하는 string을 어떻게 저장해야 할지에 대해 고심한 결과..........

결국 배열의 끝에 '\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라는 이름으로 관리 했었거든여.......

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

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

 

자 그럼 해석해봅시다....

LPSTR = long pointer string = char *

LPCSTR = long pointer constant stsring = const char *

결과적으로는 맨마지막과 같은 형이라는거죠.


W이라는 놈을 살펴보죠. W이놈은  Wide char를 나타냅니다 쉽게 말하면 unicode죠.....

win9x에서 사용하던 mulibyte와는 다릅니다. 물론 한글조합형 코드도 아니고... unicode 를 나타냅니다

 

자 그럼 다시 해석해보죠

LPWSTR = long pointer wide string = w_char*

LPCWSTR = long pointer constant wide string = const w_char*

 

위와 같이 해석합니다


T라는 놈을 살펴보죠. LPCTSTR = long pointer constant t_string = const tchar *

그런데 t_char는 무엇있냐......

마이크로 소프트가세계 각국에 제품을 판매하면서.....

각국의 언어에 맞추어 개발하는것에 환멸을 느끼다가 ......

드디어 windows를 unicode기반으로 개발하는 작업에 착수했습니다

그런데...문제는 char는  1Byte이고 wide char는 2Byte이므로.......

포인터 연산을 많이 하는 c, c++코드는 호환성에 치명적인 문제가 잇었죠...

그래서 컴파일러가 precompile option을 보고, 환경에 맞게 동작하는 코드를 작성할수잇게 새로운 변수모양의 Macro를 선언 하게 되었습니다. 그것이 바로 TCHAR, t_char 라는 변수죠

이놈들은 자신의 운영체제가 multi-byre 환경이면  char형으로, unicode 환경이라면 w_char, wide char형으로 type casting 됩니다.

 

그래서 보통  windows 9X, 2000계열 환경이라면

LPTSTR = LPSTR = char*

LPCTSTR = LPCSTR = const char*가 됩니다

 

그런데

아마 저 코드에서... (LPSTR)(LPCTSR)형변환을 할때 자세히보면,

const라는 키워드만 떼내는 거지요..... 그러니까 사실은 (char*)(const char*)와 같은 말입니다.

웃기는 형변환이죠......... 그럼 없어도 될까요? ^^ 없으면 당연히 오류가 나게 됩니다

왜냐하면 (LPSTR)string 을 하게되면 CString형 자료의 맨 처음 주소부터 char*형으로 형 변환하기때문이죠.

CString형은 앞의 16Byte를 자료형을 표현하기 때문에 여기서부터 형변환을 해주면 엉뚱한 값이 표현되게 됩니다..... 따라서 MFC 에서 제공하는 CString class는 LPCTSTR라는 함수를 통해서 일단 안전하게 const char*형으로 바뀐 자료형을 얻어오게 하는거죠


CString myString;

(LPCTSTR)myString이라고 해주면 myString내부의 string 값을 꺼내오게 도와주는 연산자 또는 함수를 사용하게 된겁니다 즉 (LPCTSTR)이란 놈이 반환값이 const char*인 함수입니다..... 정확하게 표현하자면 연산자 오버로딩이라는 것이지요 결과적으로 (LPSTR)(LPCTSTR)mystring은 mystring 의 내부 string 자료 함수를 통해 자료를 꺼내온후에 char* type으로 안전하게 바꾸어주는 역할을 하게 되는것이지요.

 

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