如果我正在为Windows开发,一些WinAPI函数要求我使用LPWSTR作为字符串数据类型。在我的库中使用C ++ 11的u16string是否可以?这两种数据类型是否相同?
看起来更像LPWSTR是wchar_t,但是没有人喜欢wchar_t ......
答案 0 :(得分:2)
C ++ 11 char16_t
类型与wchar_t
不同。从理论上讲,您可以reinterpret_cast
在char16_t*
和Windows'wchar_t*
之间(Windows'wchar_t
为16位)。但实际上,Visual C ++ 10.0 - 我认为Visual C ++ 11.0 - 缺乏对u'A'
或u"A"
等Unicode文字的支持。
总结(我发现在SO上应该更好地明确所有结论):
“在我的库中使用C ++ 11的u16string是否可以?”当然,但不是wchar_t
字符串的直接插件替换,以及如果您计划支持Visual C ++,2012目前存在问题(由于缺乏对文字的支持)。
“这两种数据类型是否相同?”否。
“没人再喜欢wchar_t了......”
情况肯定不是这样。
答案 1 :(得分:2)
wchar_t
和char16_t
是不同的类型,因此无法将u16string.c_str()
用作LPWSTR
(没有reinterpret_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());
答案 2 :(得分:1)
wchar_t
为16位,LPWSTR
值为UTF-16编码,因此,是的,您可以在与...进行交互时使用char16_t
和u16string
值API,虽然您必须进行类型转换以保持编译器满意。