首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++从std::CString创建CString失败

C++从std::CString创建CString失败
EN

Stack Overflow用户
提问于 2018-08-19 10:19:31
回答 2查看 864关注 0票数 1

在基于MFC的应用程序中,此代码:

代码语言:javascript
复制
std::string stdString("MappingName");
std::cout << "as String: " << stdString << std::endl;
CString cString(stdString.c_str());
std::cout << "as CString: " << cString << std::endl;

产生这个输出:

代码语言:javascript
复制
as String: MappingName
as CString: 01DEA060

每次运行CString时,它的值都是不同的,但是长度似乎是恒定的。其他一些结果是042219B0042C4378

我尝试过在这条线中讨论的每一个变体,结果都是一样的。我还尝试将Visual项目中的字符集从“使用Unicode字符集”更改为“使用多字节字符集”,同样没有任何效果。

转换失败的原因是什么?

编辑:更多的测试表明,std::string的值似乎没有什么区别:

代码语言:javascript
复制
tmp as String: The quick brown fox jumps over the lazy dog
tmp as CString: 00EAAF88

我还将字符集设置为Not,这也没有帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-19 10:25:57

问题是打印而不是转换。

CString可以隐含地转换为TCHAR const*。在启用unicode的情况下构建时,这是wchar_t const*

std::cout没有wchar_t const*重载的<<。它确实有一个void const*超载。

空指针重载以十六进制打印指针地址。

在打印前先铸到CStringA

代码语言:javascript
复制
std::cout << "as CString: " << static_cast<CStringA>(cString) << std::endl;

或者使用wcout打印。

票数 6
EN

Stack Overflow用户

发布于 2018-08-19 10:57:43

这个问题综合了两个方面:

  • 字符串类型与显式编码(std::string)和泛型文本映射(CStringCStringA/CStringW)的混合。
  • CString通过转换c‘在编码之间进行转换的能力。

std::string很好地转换为CString,大概是构造了一个CStringW对象。由于不存在接受operator<< ( CStringW 隐式转换为)的wchar_t const*std::ostream重载,所以它只是打印地址,与一般的void const*重载相匹配。

这里的解决方案是从图片中提取泛型文本映射,并构造一个与源编码相匹配的CString专门化( std::string的ANSI,即CStringA):

代码语言:javascript
复制
std::string stdString("MappingName");
std::cout << "as String: " << stdString << std::endl;
CStringA cString(stdString.c_str());
std::cout << "as CString: " << cString.GetString() << std::endl;

要在构造CStrings时得到关于隐式转换的通知,您可以#define _CSTRING_DISABLE_NARROW_WIDE_CONVERSION前处理器符号。这反过来会生成编译器错误,以防您试图调用任何转换c‘’tors。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51916665

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档