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



在我的基于 MFC 的应用程序中,以下代码:

std::string stdString("MappingName");
std::cout << "as String: " << stdString << std::endl;
CString cString(stdString.c_str());
std::cout << "as CString: " << cString << std::endl;

生成以下输出:

as String: MappingName
as CString: 01DEA060

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

我已经尝试了此线程中讨论的所有变体,结果都相同。我还尝试将Visual Studio项目中的字符集从">使用Unicode字符集"更改为"使用多字节字符集",但同样没有效果。

转换失败的原因可能是什么?

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

tmp as String: The quick brown fox jumps over the lazy dog
tmp as CString: 00EAAF88

我还将字符集设置为未设置,这也无济于事。

问题是打印而不是转换。

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

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

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

打印前投射到CStringA

std::cout << "as CString: " << static_cast<CStringA>(cString) << std::endl;

或使用wcout.

问题是两个方面的结合:

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

std::string转换为CString很好,大概构造了一个CStringW对象。由于采用wchar_t const*(CStringW隐式转换为(的std::ostream没有operator<<重载,因此它仅打印地址,与泛型void const*重载匹配。

这里的解决方案是将泛型文本映射从图片中剔除,并构建一个与源编码(ANSI forstd::string(匹配的CString专用化,即CStringA(:

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'tor。

相关内容

  • 没有找到相关文章

最新更新