3

Windows 向けに開発していて、一部の WinAPI 関数で LPWSTR を文字列データ型として使用する必要がある場合。ライブラリで C++11 の u16string を使用しても問題ありませんか? これらの 2 つのデータ型は同じものですか?

LPWSTR は wchar_t のように見えますが、もう誰も wchar_t を好きではありません...

4

3 に答える 3

2

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が好きではありません...」
    それは確かにそうではありません。

于 2012-08-24T00:56:15.230 に答える
2

wchar_tchar16_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());
于 2012-08-24T09:57:06.167 に答える
1

wchar_tWindows では 16 ビットであり、LPWSTR値は UTF-16 でエンコードされているため、API と対話するときに値を使用できますが、コンパイラを満足させるために型キャストする必要がありますchar16_tu16string

于 2012-08-24T01:33:35.933 に答える