Windows 向けに開発していて、一部の WinAPI 関数で LPWSTR を文字列データ型として使用する必要がある場合。ライブラリで C++11 の u16string を使用しても問題ありませんか? これらの 2 つのデータ型は同じものですか?
LPWSTR は wchar_t のように見えますが、もう誰も wchar_t を好きではありません...
C++11char16_tタイプは。とは異なりwchar_tます。理論的には、とWindows' (Windows'は16ビット)のreinterpret_cast間を行き来することができます。ただし、実際には、Visual C ++ 10.0(およびVisual C ++ 11.0も)は、またはのようなUnicodeリテラルのサポートを欠いています。char16_t*wchar_t*wchar_tu'A'u"A"
要約すると(SOでは、すべての結論を明確にする必要があることがわかりました):
「ライブラリでC++11のu16stringを使用しても大丈夫ですか?」
確かに、しかし文字列の直接のプラグイン置換としてではなくwchar_t、2012年の時点で、Visual C ++のサポートを計画している場合は、現在問題があります(リテラルのサポートがないため)。
「これらの2つのデータ型は同じものですか?」
いいえ。
「もう誰もwchar_tが好きではありません...」
それは確かにそうではありません。
wchar_tとchar16_tは異なる型であるため、 (未定義の動作を引き起こすa なしで)u16string.c_str()として使用することはできません。LPWSTRreinterpret_cast
wchar_tプラットフォームで UTF-16 としてエンコードされていることが確実な場合は、データを次の場所にコピーできます。
std::wstring my_wstring(my_u16string.begin(), my_u16string.end());
my_wstring.c_str()LPWSTR として使用します。関数呼び出しでは、一時的に使用できます。
SomeWindowsAPI(std::wstring(my_u16string.begin(), my_u16string.end()).c_str());
wchar_tWindows では 16 ビットであり、LPWSTR値は UTF-16 でエンコードされているため、API と対話するときに値を使用できますが、コンパイラを満足させるために型キャストする必要がありますchar16_t。u16string