본문 바로가기
개발, IT

LPSTR, LPCSTR, LPTSTR, LPCTSTR , LPWSTR, LPCWSTR 분석

by Nabi™ 2008. 5. 27.

LP : long pointer(.Net 에선 64bit, VC++ 은 32bit)
STR : string자료형(char* 배열의 NULL 값종료를 나타냄)
T : unicode 적용
W : wide char 2byte를 나타낸다.
C : constant (인자값변경 불가를 나타냄)

풀이
LPSTR = long pointer + string = char*
LPCSTR = long pointer + constant + string = const char*
LPCTSTR = long pointer + constant + t_char = const w_char*
LPWSTR = long pointer + wide string = w_char *
LPCWSTR = long pointer + constant + wide string = const w_char *

window 환경에서 유니코드를 표현하기 위해 TCHAR, t_char 를 쓰는데
컴파일러는 운영체제에서 MBCS환경이면, char형으로
unicode 환경이면 w_char, wide char형으로 type casting한다.
LPWSTR 에 W는 MBCS,unicode 두 환경에서 모두 unicode 문자열을 쓴다.
하지만 LPCTSTR 에 T는 환경설정에 따라서 선택해서 쓸수 있다.
그러므로 언어에 좀더 자유롭게 개발할려면 T 를 사용하는게 더 좋을것이다.

흔히 CString 를 char* 로 캐스팅할때 (LPSTR)(LPCTSTR)strWord 쓴다.
(LPCTSTR) 은 연산자 오버로딩(operator overloading)으로 const char* 를 반환한다.
그리고 const char* 를 char* 에 대입할수 없기 때문에
(LPSTR) 강제 캐스팅을 한번 더해준다.

//////////////////////////////////////////////////////////////////////////////////////////

LPSTR :  A 32-bit pointer to a character string.
         이 데이터 형같은 경우 예전에 우리가 사용하던 방식으로 선언하면
         char *
         와 같은 경우이죠. 유니코드를 지원하지 않기 때문에 각각의
         문자는 1바이트를 가집니다.

LPCSTR :  A 32-bit pointer to a constant character string.
         이 데이터 형같은 경우 예전에 우리가 사용하던 방식으로 선언하면
        const char *
         와 같은 경우이죠. const 형이 어떤건지는 아시죠? 이것역시
         유니코드를 지원하지 않기 때문에 각각의 문자는 1바이트를 가집니다.        

LPTSTR : A 32-bit pointer to a character string that is
           portable for Unicode and DBCS
          이 데이터 형같은 경우, 윈도우즈가 유니코드를 지원하면서 새로
          생긴형식으로 풀어쓰면 다음과 같습니다.
          TCHAR *
          이 형은 유니코드를 지원하기 때문에 각 문자가 2바이트를 가지게
          됩니다. 실제로 유니코드를 지원하는 프로그램을 작성하지 않는
          이상 거의 사용하지 않습니다.

LPCTSTR : A 32-bit pointer to a constant character string that
            is portable for Unicode and DBCS.
          이것 역시 윈도우즈가 유니코드를 지원하면서 새로 생긴형식으로
          풀어쓰면 다음과 같습니다.
         const TCHAR *
          마찬가지로 유니코드를 지원하기 때문에 한문자가 2바이트 크기를
          가지게 됩니다.

함수뒤에 const 를 붙이는건 클래스 멤버함수내에서 this 사용을 제한하기 위해서 사용합니다.
일반적으로 멤버 함수내에서 사용되는 this는 해당 클래스가 MyClass 인 경우에,

MyClass * const this;

와 같이 내부적으로 선언되어서 사용되는데, 함수의 뒤에 const를 붙이면

const MyClass * const this;

와 같이 속성이 바뀌어져서 사용됩니다. 즉 내부에 사용되는 데이터 멤버가 이 함수에서는 모조리
읽기 전용으로 바뀌어져 버리는거죠...

this 변수가 가리키는 멤버들이 모두 쓰기 불능으로 되어버리기 때문에... 즉, this는 우리가 직접
변경할수 없기 때문에 함수뒤에 const를 붙여 간접적으로 this를 const형으로 변경하는 기능을
구현한겁니다.

//////////////////////////////////////////////////////////////////////////////////////////

[Windows Programming 기초편]

BOOL       -- Boolean 값을 나타내는 정수 값. 0 or 1

BSTR        -- 32비트 character 포인터 값을 의미

BYTE        -- unsigned 8비트 정수값  == unsigned char

WORD       -- 16비트 unsigned int

DWORD     -- 32비트 unsigned 정수   == unsigned int

LONG       -- 32비트 signed 정수값

LPCSTR    -- 32비트 문자열 포인터, const형  == const char*

LPSTR      -- 32비트 문자열 포인터

LPCTSTR  -- 유니 코드 문자열을 포인트할 수 있는 const 32비트 문자열 포인터

LPTSTR    -- 유니 코드 문자열을 포인트할 수 있는 32비트 문자열 포인터

LPVOID    -- 32비트 void 포인터

UINT        -- 32비트 unsigned int


좋은정보가 되셨다면 아래 한번 클릭해주세요^^



댓글