Apa perbedaan antara LPCSTR, LPCTSTRdan LPTSTR?
Mengapa kita perlu melakukan ini untuk mengubah string menjadi variabel LV/ _ITEMstruktur pszText:
LV_DISPINFO dispinfo;
dispinfo.item.pszText = LPTSTR((LPCTSTR)string);
Apa perbedaan antara LPCSTR, LPCTSTRdan LPTSTR?
Mengapa kita perlu melakukan ini untuk mengubah string menjadi variabel LV/ _ITEMstruktur pszText:
LV_DISPINFO dispinfo;
dispinfo.item.pszText = LPTSTR((LPCTSTR)string);
Jawaban:
Untuk menjawab bagian pertama dari pertanyaan Anda:
LPCSTRadalah pointer ke string const (LP berarti Long Pointer )
LPCTSTRadalah penunjuk ke const TCHARstring, ( TCHARbisa berupa karakter lebar atau karakter tergantung pada apakah UNICODE ditentukan dalam proyek Anda)
LPTSTRadalah penunjuk ke TCHARstring (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.
STRadalah string
yang Tdibuat 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)UNICODEdefinisinyaTCHAR: alias WCHARjika UNICODE ditentukan; jika tidakCHARLPTSTR: 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
LPWSTRLPCWSTRSisanya dimaksudkan untuk mendukung platform ANSI atau kompilasi ganda. Itu tidak lagi relevan hari ini seperti dulu.
std::stringkarena masih merupakan string berbasis ASCII dan lebih suka std::wstringsebagai gantinya.
*Aversi 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 LVITEMstruct MS memiliki LPTSTR, yaitu pointer T-string yang bisa berubah , bukanLPCTSTR . Apa yang kamu lakukan adalah
1) ubah string( CStringtebakan) 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 dispinfoyang digunakan untuk apakah ada kemungkinan bahwa ListViewpanggilan 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 CStringAnda 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 LPCTSTRsebagai LPTSTRkeinginan ... tetapi suatu hari, ketika Anda tidak mengharapkannya ...
xxx_cast<>()sebagai gantinya.
xxx_cast<>daripada mencampur dua gaya casting berbasis braket yang berbeda!