답변:
질문의 첫 부분에 답하려면 :
LPCSTR
const 문자열에 대한 포인터 (LP는 Long Pointer를 의미 함 )
LPCTSTR
const TCHAR
문자열에 대한 포인터입니다 ( TCHAR
프로젝트에 UNICODE가 정의되었는지 여부에 따라 와이드 문자 또는 문자).
LPTSTR
상수가 아닌 TCHAR
문자열에 대한 포인터입니다.
과거에 이것에 대해 이야기 할 때, 우리는 단순성을 위해 "pointer to a"문구를 생략했지만, lightness-races-in-orbit에서 언급했듯이 그것들은 모두 포인터입니다.
이것은 C ++ 문자열을 설명 하는 훌륭한 코드 프로젝트 문서입니다 (다른 유형을 비교하는 차트는 2/3 참조).
extern "C"
. 그 외에도 "포인터"비트 또는 C 문자열과 같은 특정 설명이 필요합니다.
빠르고 더러운 :
LP
== L 옹 P의 ointer. 포인터 또는 문자 *
C
= C onst,이 경우에는 문자열이 const가 아니라 포인터가 const라는 것을 의미한다고 생각합니다.
STR
이다 문자열
는 T
컴파일 옵션에 따라 다양한 문자 또는 문자 (TCHAR)입니다.
char
: 8 비트 문자-기본 C / C ++ 데이터 유형CHAR
: 별칭 char
-Windows 데이터 유형LPSTR
: ( L ong P ointer) 의 null로 끝나는 문자열CHAR
LPCSTR
: ( L ong P ointer) 의 상수 null로 끝나는 문자열CHAR
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
: WCHAR
UNICODE가 정의 된 경우 별칭 ; 그렇지 않으면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 플랫폼 또는 이중 컴파일을 지원하기위한 것입니다. 오늘날에는 예전만큼 관련성이 없습니다.
std::string
경우 여전히 ASCII 기반 문자열이기 때문에 피하고 std::wstring
대신 선호 합니다.
*A
UTF-8 코드 페이지와 호환되는 WinAPI 버전 을 만들기 위해 노력하고 있기 때문에 갑자기 훨씬 더 관련성이 높아졌습니다. ; P
질문의 두 번째 부분에 답하려면 다음과 같은 작업을 수행해야합니다.
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
것이 효과가 있지만 언젠가는 예상치 못한 일이 발생합니다 ...
xxx_cast<>()
대신 사용해야 합니다.
xxx_cast<>
두 개의 다른 대괄호 기반 캐스팅 스타일을 혼합 것보다 !