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);
c++
windows
visual-c++
mfc
tidak ada
sumber
sumber
Jawaban:
Untuk menjawab bagian pertama dari pertanyaan Anda:
LPCSTR
adalah pointer ke string const (LP berarti Long Pointer )LPCTSTR
adalah penunjuk keconst TCHAR
string, (TCHAR
bisa berupa karakter lebar atau karakter tergantung pada apakah UNICODE ditentukan dalam proyek Anda)LPTSTR
adalah penunjuk keTCHAR
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)
sumber
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 stringyang
T
dibuat untuk karakter lebar atau char (TCHAR) tergantung pada opsi kompilasi.sumber
AnsiString 8-bit
char
: Karakter 8-bit - tipe data C / C ++ yang mendasariCHAR
: alias darichar
- tipe data WindowsLPSTR
: string diakhiri null dariCHAR
( L ong P ointer)LPCSTR
: string diakhiri null konstan dariCHAR
( L ong P ointer)UnicodeString 16-bit
wchar_t
: Karakter 16-bit - tipe data C / C ++ yang mendasariWCHAR
: alias dariwchar_t
- tipe data WindowsLPWSTR
: string diakhiri null dariWCHAR
( L ong P ointer)LPCWSTR
: string diakhiri null konstan dariWCHAR
( L ong P ointer)tergantung pada
UNICODE
definisinyaTCHAR
: aliasWCHAR
jika UNICODE ditentukan; jika tidakCHAR
LPTSTR
: string diakhiri null dariTCHAR
( L ong P ointer)LPCTSTR
: string diakhiri null konstan dariTCHAR
( L ong P ointer)Begitu
Bonus Membaca
TCHAR
→ Karakter Teks ( archive.is )sumber
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.
sumber
std::string
karena masih merupakan string berbasis ASCII dan lebih sukastd::wstring
sebagai gantinya.*A
versi WinAPI kompatibel dengan halaman kode UTF-8, tiba-tiba mereka jauh lebih relevan. ; PUntuk menjawab bagian kedua dari pertanyaan Anda, Anda perlu melakukan hal-hal seperti
karena
LVITEM
struct MS memilikiLPTSTR
, yaitu pointer T-string yang bisa berubah , bukanLPCTSTR
. Apa yang kamu lakukan adalah1) 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 bahwaListView
panggilan Anda akan berakhir mencoba untuk menulis melalui itupszText
. 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 menggunakanstring.GetBuffer()
- yang dengan sengaja memberi Anda yang dapat ditulisiLPTSTR
. Anda kemudian harus ingat untuk memanggilReleaseBuffer()
jika string berubah. Atau Anda dapat mengalokasikan buffer sementara lokal dan menyalin string ke sana.99% dari waktu ini tidak perlu dan memperlakukannya
LPCTSTR
sebagaiLPTSTR
keinginan ... tetapi suatu hari, ketika Anda tidak mengharapkannya ...sumber
xxx_cast<>()
sebagai gantinya.xxx_cast<>
daripada mencampur dua gaya casting berbasis braket yang berbeda!