LPCSTR, LPCTSTR 및 LPTSTR 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것이 효과가 있지만 언젠가는 예상치 못한 일이 발생합니다 …