Ne arasındaki fark LPCSTR
, LPCTSTR
ve LPTSTR
?
Bir dizgeyi bir dizgeye dönüştürmek için neden bunu yapmamız gerekiyor? LV
/ _ITEM
yapı değişkeninepszText
:
LV_DISPINFO dispinfo;
dispinfo.item.pszText = LPTSTR((LPCTSTR)string);
Ne arasındaki fark LPCSTR
, LPCTSTR
ve LPTSTR
?
Bir dizgeyi bir dizgeye dönüştürmek için neden bunu yapmamız gerekiyor? LV
/ _ITEM
yapı değişkeninepszText
:
LV_DISPINFO dispinfo;
dispinfo.item.pszText = LPTSTR((LPCTSTR)string);
Yanıtlar:
Sorunuzun ilk bölümünü cevaplamak için:
LPCSTR
const dizgesine bir göstericidir (LP, Uzun İşaretçi anlamına gelir )
LPCTSTR
bir const TCHAR
dizeye bir göstericidir ( TCHAR
projenizde UNICODE'un tanımlanıp tanımlanmadığına bağlı olarak geniş karakter veya karakter olabilir)
LPTSTR
(const olmayan) bir TCHAR
dizeye bir göstericidir
Pratikte, geçmişte bunlar hakkında konuşurken, basitlik için "işaretçi" ifadesini dışarıda bıraktık, ancak yörüngedeki hafiflik yarışları tarafından belirtildiği gibi bunların hepsi birer işaretçi.
Bu, C ++ dizelerini açıklayan harika bir kod proje makalesidir (farklı türleri karşılaştıran bir grafik için aşağı doğru 2 / 3'e bakın)
extern "C"
. Bunun dışında, evet, kesinlikle ya "işaretçi" bitine ya da bir C dizesi olarak belirli bir açıklamaya ihtiyaç duymalıdır.
Hızlı ve kirli:
LP
== L ong P ointer. İşaretçiyi veya karakteri düşün *
C
= C onst, bu durumda, karakter dizesinin sabit olan gösterici değil, sabit olduğunu kastettiklerini düşünüyorum.
STR
olduğu dize
bu T
, derleme seçeneklerine bağlı olarak geniş bir karakter veya karakter (TCHAR) içindir.
char
: 8 bit karakter - temel alınan C / C ++ veri türüCHAR
: alias of char
- Windows veri türüLPSTR
: boş sonlu dizge CHAR
( L ong P ointer)LPCSTR
: sabit boş sonlu dizi CHAR
( L ong P ointer)wchar_t
: 16 bit karakter - temel alınan C / C ++ veri türüWCHAR
: alias of wchar_t
- Windows veri türüLPWSTR
: boş sonlu dizge WCHAR
( L ong P ointer)LPCWSTR
: sabit boş sonlu dizi WCHAR
( L ong P ointer)UNICODE
tanımlamaya bağlı olarakTCHAR
: WCHAR
UNICODE tanımlanmışsa takma adı ; aksi takdirdeCHAR
LPTSTR
: boş sonlu dizge TCHAR
( L ong P ointer)LPCTSTR
: sabit boş sonlu dizi TCHAR
( L ong P ointer)Yani
| Item | 8-bit | 16-bit | Varies |
|-------------------|--------------|-------------|-----------------|
| character | CHAR | WCHAR | TCHAR |
| string | LPSTR | LPWSTR | LPTSTR |
| string (const) | LPCSTR | LPCWSTR | LPCTSTR |
TCHAR
→ Metin Karakteri ( arşiv.is )
John ve Tim'in cevabına ekleniyor.
Win98 için kodlamadığınız sürece, uygulamanızda kullanmanız gereken 6+ dize türünden yalnızca ikisi vardır.
LPWSTR
LPCWSTR
Geri kalanı ANSI platformlarını veya ikili derlemeleri desteklemek içindir. Bunlar eskisi kadar bugün alakalı değil.
std::string
çünkü hala ASCII tabanlı bir dizedir ve std::wstring
onun yerine tercih eder .
*A
WinAPI sürümlerini UTF-8 kod sayfasıyla uyumlu hale getirmeye çalıştığına göre, birdenbire çok daha alakalı hale geldi. ; P
Sorunuzun ikinci bölümünü cevaplamak için aşağıdaki gibi şeyler yapmanız gerekir:
LV_DISPINFO dispinfo;
dispinfo.item.pszText = LPTSTR((LPCTSTR)string);
çünkü MS'in LVITEM
yapısı bir LPTSTR
, yani değiştirilebilir bir T-dizgisi işaretleyicisine sahip, bir değil LPCTSTR
. Ne yapıyorsun
1) string
( CString
a tahmininde) birLPCTSTR
yı (pratikte karakter tamponunun adresini salt okunur bir işaretçi olarak almak anlamına gelir) dönüştür
2) o salt okunur işaretçiyi const
-ness'ını atarak yazılabilir bir işaretçiye dönüştürün .
Aramanızın bunun üzerinden yazmaya çalışarak sona dispinfo
erme şansı olup olmadığı, neyin kullanıldığına bağlıdır .ListView
pszText
. Eğer öyleyse, bu potansiyel olarak çok kötü bir şeydir: Sonuçta size salt okunur bir işaretçi verilmiş ve sonra onu yazılabilir olarak değerlendirmeye karar vermişsiniz: belki de salt okunur olmasının bir nedeni vardır!
Eğer birlikte CString
çalışıyorsanız, kullanma seçeneğiniz vardır string.GetBuffer()
- bu size kasıtlı olarak yazılabilirlik sağlar LPTSTR
. Ardından ReleaseBuffer()
, dizge değişirse aramayı hatırlamanız gerekir . Veya yerel bir geçici tampon ayırabilir ve dizeyi oraya kopyalayabilirsiniz.
Zamanın% 99'u gereksiz olacak ve LPCTSTR
bir LPTSTR
irade gibi davranmak işe yarayacak ... ama bir gün, hiç beklemediğin zaman ...
xxx_cast<>()
bunun yerine kullanmalısınız .
xxx_cast<>
yazsaydım, iki farklı parantez tabanlı döküm stilini karıştırmak yerine kesinlikle kullanırdı !