Programming

LPCSTR, LPCTSTR 및 LPTSTR

procodes 2020. 8. 18. 20:26
반응형

LPCSTR, LPCTSTR 및 LPTSTR


LPCSTR, LPCTSTR의 차이점은 무엇입니까 LPTSTR?

왜 우리가로 문자열을 변환하는이 작업을 수행해야합니까 LV/ _ITEM구조 변수 pszText:

LV_DISPINFO dispinfo;  
dispinfo.item.pszText = LPTSTR((LPCTSTR)string);

질문의 첫 부분에 답하려면 :

LPCSTRconst 문자열에 대한 포인터 (LP는 Long Pointer를 의미 함 )

LPCTSTRconst TCHAR문자열에 대한 포인터입니다 ( TCHAR프로젝트에 UNICODE가 정의되었는지 여부에 따라 와이드 문자 또는 문자).

LPTSTR상수가 아닌 TCHAR문자열에 대한 포인터입니다.

실제로 과거에 이것에 대해 이야기 할 때 단순성을 위해 "pointer to a"문구를 생략했지만, lightness-races-in-orbit에서 언급했듯이 모두 포인터입니다.

이것은 C ++ 문자열을 설명 하는 훌륭한 코드 프로젝트 문서입니다 (다른 유형을 비교하는 차트는 2/3 참조).


빠르고 더러운 :

LP== LP의 ointer. 포인터 또는 문자 *

C= C onst,이 경우에는 문자열이 const가 아니라 포인터가 const라는 것을 의미한다고 생각합니다.

STR이다 문자열

T컴파일 옵션에 따라 다양한 문자 또는 문자 (TCHAR)입니다.


8 비트 AnsiStrings

  • char: 8 비트 문자-기본 C / C ++ 데이터 유형
  • CHAR: 별칭 char-Windows 데이터 유형
  • LPSTR: ( L ong P ointer) 의 null로 끝나는 문자열CHAR
  • LPCSTR: ( L ong P ointer) 의 상수 null로 끝나는 문자열CHAR

16 비트 유니 코드 문자열

  • wchar_t: 16 비트 문자-기본 C / C ++ 데이터 유형
  • WCHAR: 별칭 wchar_t-Windows 데이터 유형
  • LPWSTR: ( L ong P ointer) 의 null로 끝나는 문자열WCHAR
  • LPCWSTR: ( L ong P ointer) 의 상수 null로 끝나는 문자열WCHAR

UNICODE정의 에 따라

  • TCHAR: WCHARUNICODE가 정의 된 경우 별칭 ; 그렇지 않으면CHAR
  • LPTSTR: ( L ong P ointer) 의 null로 끝나는 문자열TCHAR
  • LPCTSTR: ( L ong P ointer) 의 상수 null로 끝나는 문자열TCHAR

그래서

| Item              | 8-bit        | 16-bit      | Varies          |
|-------------------|--------------|-------------|-----------------|
| character         | CHAR         | WCHAR       | TCHAR           |
| string            | LPSTR        | LPWSTR      | LPTSTR          |
| string (const)    | LPCSTR       | LPCWSTR     | LPCTSTR         |

보너스 읽기

TCHAR텍스트 문자 ( archive.is )


John과 Tim의 대답에 추가합니다.

Win98 용으로 코딩하지 않는 한, 애플리케이션에서 사용해야하는 6 개 이상의 문자열 유형 중 두 가지만 있습니다.

  • LPWSTR
  • LPCWSTR

나머지는 ANSI 플랫폼 또는 이중 컴파일을 지원하기위한 것입니다. 오늘날에는 예전만큼 관련성이 없습니다.


질문의 두 번째 부분에 답하려면 다음과 같은 작업을 수행해야합니다.

LV_DISPINFO dispinfo;  
dispinfo.item.pszText = LPTSTR((LPCTSTR)string);

MS의 때문에 LVITEM구조체가있다 LPTSTR, 즉 가변 T-문자열 포인터가 아닌를 LPCTSTR. 당신이하는 일은

1) string( CString추측에 따라)를 LPCTSTR(실제로는 읽기 전용 포인터로 문자 버퍼의 주소를 얻는 것을 의미합니다)

2) 읽기 전용 포인터를 const-ness 를 캐스트하여 쓰기 가능한 포인터로 변환 하십시오.

그것은 dispinfo당신의 ListView호출이 그것을 통해 쓰기시도하게 될 가능성이 있는지 여부에 사용되는 것에 달려 pszText있습니다. 만약 그렇다면, 이것은 잠재적으로 매우 나쁜 일입니다. 결국 여러분은 읽기 전용 포인터를받은 다음 그것을 쓰기 가능으로 취급하기로 결정했습니다 : 아마도 그것이 읽기 전용 인 이유가있을 것입니다!

그것은 경우 CString당신이 당신과 함께 작업하고 사용할 수있는 옵션이 string.GetBuffer()의도적으로 당신에게 쓰기를 준다을 - LPTSTR. 그런 다음 ReleaseBuffer()문자열이 변경되면 호출하는 것을 기억해야합니다 . 또는 로컬 임시 버퍼를 할당하고 거기에 문자열을 복사 할 수 있습니다.

99 %의 시간이 불필요하고 유언장으로 취급하는 LPCTSTR것은 효과 LPTSTR가 있지만 언젠가는 최소한 예상 할 때 ...

참고URL : https://stackoverflow.com/questions/321413/lpcstr-lpctstr-and-lptstr

반응형