C++:LPWSTR在cout中打印为地址

10
我有一个类型为LPTSTR的变量,我使用<<将其打印到std::cout中。在ANSI系统(不知道确切的确定位置)中可以正常工作,它会打印字符串。现在在Unicode系统中,我得到了一个十六进制地址而不是字符串。那么,为什么LPSTR (如果未定义UNICODE,则解析为其中之一LPTSTR的行为与LPWSTR (如果定义了UNICODE的行为不同,并且我如何打印后者指向的字符串?
1个回答

16

对于Unicode字符串,您应该使用wcout

您可能看到十六进制数字是因为ANSI/ASCII输出流不知道如何处理Unicode字符。

LPTSTRLPWSTR实际上是从C Windows API时代继承下来的C语言习惯用法。对于C ++,我强烈建议您改用std::string和/或std::wstring

如果您需要编写自己的宏,则需要类似以下内容:

#ifdef _UNICODE
std::wostream& COUT = std::wcout;
#else
std::ostream& COUT = std::cout;
#endif

1
哦,谢谢。有没有标准的宏可以自动解析为cout或wcout? - lapis
关于使用std :: string - 不幸的是,WinAPI函数中使用LPTSTR,所以我不得不使用它们。为避免不必要的转换,我必须一直使用它们。 - lapis
当您想要传递给Windows API的C风格空终止字符串时,可以使用.c_str()方法。 - David
那么WinAPI函数返回的字符串呢?我必须为每个字符串创建新的字符串对象才能使用它。而且,最重要的是,这些字符串通常是WinAPI结构体的成员...具体来说,我有一个从函数返回的这种结构体数组。将其中的字符串转换为std::string是不可能的。 - lapis
1
我会使用std :: wostream& COUT = std :: wcout;std :: wostream& COUT = std :: cout;代替#define COUT wcout#define COUT cout - AntonK
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接