どう違いますかLPCSTR
、LPCTSTR
およびLPTSTR
?
なぜ我々はに文字列を変換するために、これを実行する必要がありますLV
/ _ITEM
構造体変数pszText
:
LV_DISPINFO dispinfo;
dispinfo.item.pszText = LPTSTR((LPCTSTR)string);
どう違いますかLPCSTR
、LPCTSTR
およびLPTSTR
?
なぜ我々はに文字列を変換するために、これを実行する必要がありますLV
/ _ITEM
構造体変数pszText
:
LV_DISPINFO dispinfo;
dispinfo.item.pszText = LPTSTR((LPCTSTR)string);
回答:
質問の最初の部分に答えるには:
LPCSTR
const文字列へのポインタです(LPはLong Pointerを意味します)
LPCTSTR
const TCHAR
文字列へのポインタです(TCHAR
プロジェクトでUNICODEが定義されているかどうかによって、ワイド文字または文字になります)
LPTSTR
(非const)TCHAR
文字列へのポインタです
実際、過去にこれらについて話すときは、単純化のために「ポインタへのポインタ」句を省略しましたが、軌道上の明るさのレースで言及されているように、これらはすべてポインタです。
これは、C ++文字列を説明する素晴らしいcodeprojectの記事です(異なるタイプを比較するチャートについては、下の2/3を参照してください)。
extern "C"
たCリンケージがある。それとは別に、そうです、「ポインタ」ビットか、C文字列としての特定の説明が必要です。
素早く汚い:
LP
== LオングPの ointer。ポインタまたはchar *を考えてください
C
= C onst、この場合、文字列がconstであって、ポインタがconstではないことを意味すると思います。
STR
ある文字列は、
これT
は、コンパイルオプションに応じて、ワイド文字または文字(TCHAR)用です。
char
:8ビット文字-基礎となるC / C ++データ型CHAR
:のエイリアスchar
-Windowsデータ型LPSTR
:(L ong P ointer)の nullで終了する文字列CHAR
LPCSTR
:(L ong P ointer)の nullで終了する定数文字列CHAR
wchar_t
:16ビット文字-基礎となるC / C ++データ型WCHAR
:のエイリアスwchar_t
-Windowsデータ型LPWSTR
:(L ong P ointer)の nullで終了する文字列WCHAR
LPCWSTR
:(L ong P ointer)の nullで終了する定数文字列WCHAR
UNICODE
定義によってTCHAR
:WCHAR
UNICODEが定義されている場合のエイリアス。さもないとCHAR
LPTSTR
:(L ong P ointer)の nullで終了する文字列TCHAR
LPCTSTR
:(L ong P ointer)の nullで終了する定数文字列TCHAR
そう
| Item | 8-bit | 16-bit | Varies |
|-------------------|--------------|-------------|-----------------|
| character | CHAR | WCHAR | TCHAR |
| string | LPSTR | LPWSTR | LPTSTR |
| string (const) | LPCSTR | LPCWSTR | LPCTSTR |
TCHAR
→ テキスト文字 (archive.is)
ジョンとティムの答えに追加。
Win98用にコーディングしていない限り、アプリケーションで使用する必要がある6つ以上の文字列タイプは2つだけです。
LPWSTR
LPCWSTR
残りはANSIプラットフォームまたはデュアルコンパイルをサポートするためのものです。それらは、以前ほど重要ではありません。
std::string
場合は、ASCIIベースの文字列であるため、回避し、std::wstring
代わりに使用します。
*A
WinAPI のバージョンをUTF-8コードページと互換性のあるものにすることに取り組んでいる今、それらは突然より関連性があります。; P
質問の2番目の部分に答えるには、次のようなことをする必要があります
LV_DISPINFO dispinfo;
dispinfo.item.pszText = LPTSTR((LPCTSTR)string);
MSのLVITEM
構造体にはLPTSTR
、つまり変更可能な T文字列ポインタがあり、LPCTSTR
。あなたがしていることは
1)string
(CString
推測で)a をLPCTSTR
(実際には文字バッファーのアドレスを読み取り専用ポインターとして取得することを意味しますます
2)const
-nessをキャストして、読み取り専用ポインターを書き込み可能ポインターに変換します。
それはdispinfo
あなたのListView
呼び出しがそれを介して書き込もうとする可能性があるかどうかに使用されるものに依存しますpszText
。もしそうなら、これは潜在的に非常に悪いことです:結局、あなたは読み取り専用のポインタを与えられて、それを書き込み可能として扱うことに決めました:多分それが読み取り専用だった理由があるかもしれません!
それがaである場合は、CString
使用するオプションがあります。これstring.GetBuffer()
により、意図的に書き込み可能になりLPTSTR
ます。ReleaseBuffer()
文字列が変更された場合は、必ず呼び出すことを忘れないでください。または、ローカルの一時バッファを割り当てて、そこに文字列をコピーすることもできます。
99%の時間はこれが不要でありLPCTSTR
、LPTSTR
意志で動作するように扱われます...しかし、ある日、あなたがそれを最も期待しないとき...
xxx_cast<>()
代わりに使用してください。
xxx_cast<>
2つの異なるブラケットベースのキャストスタイルを混在させるのではなく、コードを使用したはずです。