Apa perbedaan antara LPCSTR
, LPCTSTR
dan LPTSTR
?
Mengapa kita perlu melakukan ini untuk mengubah string menjadi variabel LV
/ _ITEM
struktur pszText
:
LV_DISPINFO dispinfo;
dispinfo.item.pszText = LPTSTR((LPCTSTR)string);
Apa perbedaan antara LPCSTR
, LPCTSTR
dan LPTSTR
?
Mengapa kita perlu melakukan ini untuk mengubah string menjadi variabel LV
/ _ITEM
struktur pszText
:
LV_DISPINFO dispinfo;
dispinfo.item.pszText = LPTSTR((LPCTSTR)string);
Jawaban:
Untuk menjawab bagian pertama dari pertanyaan Anda:
LPCSTR
adalah pointer ke string const (LP berarti Long Pointer )
LPCTSTR
adalah penunjuk ke const TCHAR
string, ( TCHAR
bisa berupa karakter lebar atau karakter tergantung pada apakah UNICODE ditentukan dalam proyek Anda)
LPTSTR
adalah penunjuk ke TCHAR
string (non-const)
Dalam praktiknya ketika membicarakan hal ini di masa lalu, kita telah meninggalkan frasa "penunjuk ke" untuk kesederhanaan, tetapi seperti yang disebutkan oleh lightness-races-in-orbit semuanya adalah petunjuk.
Ini adalah artikel proyek kode yang bagus yang menjelaskan string C ++ (lihat 2/3 cara ke bawah untuk bagan yang membandingkan berbagai jenis)
extern "C"
. Selain itu, ya, itu pasti membutuhkan baik "pointer" bit, atau deskripsi spesifik sebagai string C.
Cepat dan kotor:
LP
== L ong P ointer. Pikirkan saja pointer atau char *
C
= C onst, dalam hal ini, saya pikir yang mereka maksud adalah string karakter adalah sebuah const, bukan penunjuk yang menjadi const.
STR
adalah string
yang T
dibuat untuk karakter lebar atau char (TCHAR) tergantung pada opsi kompilasi.
char
: Karakter 8-bit - tipe data C / C ++ yang mendasariCHAR
: alias dari char
- tipe data WindowsLPSTR
: string diakhiri null dari CHAR
( L ong P ointer)LPCSTR
: string diakhiri null konstan dari CHAR
( L ong P ointer)wchar_t
: Karakter 16-bit - tipe data C / C ++ yang mendasariWCHAR
: alias dari wchar_t
- tipe data WindowsLPWSTR
: string diakhiri null dari WCHAR
( L ong P ointer)LPCWSTR
: string diakhiri null konstan dari WCHAR
( L ong P ointer)UNICODE
definisinyaTCHAR
: alias WCHAR
jika UNICODE ditentukan; jika tidakCHAR
LPTSTR
: string diakhiri null dari TCHAR
( L ong P ointer)LPCTSTR
: string diakhiri null konstan dari TCHAR
( L ong P ointer)Begitu
| Item | 8-bit | 16-bit | Varies |
|-------------------|--------------|-------------|-----------------|
| character | CHAR | WCHAR | TCHAR |
| string | LPSTR | LPWSTR | LPTSTR |
| string (const) | LPCSTR | LPCWSTR | LPCTSTR |
TCHAR
→ Karakter Teks ( archive.is )
Menambah jawaban John dan Tim.
Kecuali Anda membuat kode untuk Win98, hanya ada dua dari 6+ tipe string yang harus Anda gunakan dalam aplikasi Anda
LPWSTR
LPCWSTR
Sisanya dimaksudkan untuk mendukung platform ANSI atau kompilasi ganda. Itu tidak lagi relevan hari ini seperti dulu.
std::string
karena masih merupakan string berbasis ASCII dan lebih suka std::wstring
sebagai gantinya.
*A
versi WinAPI kompatibel dengan halaman kode UTF-8, tiba-tiba mereka jauh lebih relevan. ; P
Untuk menjawab bagian kedua dari pertanyaan Anda, Anda perlu melakukan hal-hal seperti
LV_DISPINFO dispinfo;
dispinfo.item.pszText = LPTSTR((LPCTSTR)string);
karena LVITEM
struct MS memiliki LPTSTR
, yaitu pointer T-string yang bisa berubah , bukanLPCTSTR
. Apa yang kamu lakukan adalah
1) ubah string
( CString
tebakan) menjadiLPCTSTR
(yang dalam praktiknya berarti mendapatkan alamat buffer karakternya sebagai penunjuk hanya-baca)
2) ubah penunjuk hanya-baca itu menjadi penunjuk yang dapat ditulisi dengan membuang const
-ness - nya.
Itu tergantung apa dispinfo
yang digunakan untuk apakah ada kemungkinan bahwa ListView
panggilan Anda akan berakhir mencoba untuk menulis melalui itu pszText
. Jika ya, ini berpotensi menjadi hal yang sangat buruk: setelah semua Anda diberi penunjuk hanya-baca dan kemudian memutuskan untuk memperlakukannya sebagai dapat ditulisi: mungkin ada alasan mengapa itu hanya-baca!
Jika itu adalah CString
Anda bekerja dengan Anda memiliki opsi untuk menggunakan string.GetBuffer()
- yang dengan sengaja memberi Anda yang dapat ditulisi LPTSTR
. Anda kemudian harus ingat untuk memanggil ReleaseBuffer()
jika string berubah. Atau Anda dapat mengalokasikan buffer sementara lokal dan menyalin string ke sana.
99% dari waktu ini tidak perlu dan memperlakukannya LPCTSTR
sebagai LPTSTR
keinginan ... tetapi suatu hari, ketika Anda tidak mengharapkannya ...
xxx_cast<>()
sebagai gantinya.
xxx_cast<>
daripada mencampur dua gaya casting berbasis braket yang berbeda!