Ne arasındaki fark LPCSTR, LPCTSTRve LPTSTR?
Bir dizgeyi bir dizgeye dönüştürmek için neden bunu yapmamız gerekiyor? LV / _ITEMyapı değişkeninepszText :
LV_DISPINFO dispinfo;
dispinfo.item.pszText = LPTSTR((LPCTSTR)string);
Ne arasındaki fark LPCSTR, LPCTSTRve LPTSTR?
Bir dizgeyi bir dizgeye dönüştürmek için neden bunu yapmamız gerekiyor? LV / _ITEMyapı değişkeninepszText :
LV_DISPINFO dispinfo;
dispinfo.item.pszText = LPTSTR((LPCTSTR)string);
Yanıtlar:
Sorunuzun ilk bölümünü cevaplamak için:
LPCSTRconst dizgesine bir göstericidir (LP, Uzun İşaretçi anlamına gelir )
LPCTSTRbir const TCHARdizeye bir göstericidir ( TCHARprojenizde UNICODE'un tanımlanıp tanımlanmadığına bağlı olarak geniş karakter veya karakter olabilir)
LPTSTR(const olmayan) bir TCHARdizeye 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.
STRolduğ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)UNICODEtanımlamaya bağlı olarakTCHAR: WCHARUNICODE tanımlanmışsa takma adı ; aksi takdirdeCHARLPTSTR: 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.
LPWSTRLPCWSTRGeri 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::wstringonun yerine tercih eder .
*AWinAPI 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 LVITEMyapısı bir LPTSTR, yani değiştirilebilir bir T-dizgisi işaretleyicisine sahip, bir değil LPCTSTR. Ne yapıyorsun
1) string( CStringa 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 dispinfoerme şansı olup olmadığı, neyin kullanıldığına bağlıdır .ListViewpszText . 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 LPCTSTRbir LPTSTRirade 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ı !