我在C ++中有一个使用std :: string和std :: wstring的MFC应用程序,并经常从一个转换为另一个,还有很多其他的废话。我需要将所有内容标准化为单一格式,因此我想知道是否应该使用CString或std :: wstring。
在应用程序中,我需要从字符串表生成字符串,处理大量需要常量tchar或wchar_t指针的Windows调用,编辑控件,并与需要BSTR的COM对象API进行交互。
我也有字符串向量,所以CStrings向量是否有任何问题?
哪一个更好?各自的优点和缺点是什么?
实施例
BSTR to wstring
CComBSTR tstr;
wstring album;
if( (trk->get_Info((BSTR *)&tstr)) == S_OK && tstr!= NULL)
album = (wstring)tstr;
wstring to BSTR
CComBSTR tstr = path.c_str();
if(trk->set_Info(tstr) == S_OK)
return true;
字符串资源到wstring
CString t;
wstring url;
t.LoadString(IDS_SCRIPTURL);
url = t;
GetProfileString()返回一个CString。
整数到字符串格式:
wchar_t total[32];
swprintf_s(total, 32, L"%d", trk->getInt());
wstring tot(total);
答案 0 :(得分:10)
的std :: basic_string的<> (或者更确切地说,它的专业化)使用起来非常糟糕,它是STL的一个主要缺点(我会说C ++)。它甚至不知道编码 - 来吧,这是2010年。能够定义角色的大小是不够的,因为没有办法在basic_string<>中指出可变大小的字符。现在,utf-8不适合使用CString,但它并不像尝试使用basic_string那样糟糕。虽然我同意上述海报的精神,即标准解决方案比替代方案更好,但CString(无论如何你的项目使用MFC或ATL)比std :: string / wstring更好用:ANSI / Unicode之间的转换(通过CStringA和CStringW),BSTR,从字符串表加载,将运算符转换为TCHAR(.c_str()?真的?),...
CString也有Format(),虽然不安全但有点难看,但很方便。如果您更喜欢安全的格式化库,那么使用basic_string会更好。
此外,CString有一些算法作为成员函数,你需要在basic_string上使用boost字符串实用程序,例如trim,split等。
CString的矢量没问题。
防止CString因为仅限Windows而被解雇CS:如果你在Windows GUI中使用它,那么该应用程序无论如何都是仅限Windows的。话虽如此,如果您的代码将来有可能需要跨平台,那么您将会遇到basic_string<>。
答案 1 :(得分:9)
在这种情况下,我个人会选择CString
,因为你声明你正在使用BSTR
,使用COM,并在MFC中编写它。虽然wstring
s会更符合标准,但您会遇到不断从一个转换到另一个的问题。由于您正在使用COM并将其写入MFC,因此没有理由担心将其设置为跨平台,因为没有其他操作系统具有类似Windows的COM,并且MFC已经将您锁定在Windows中。
正如您所指出的,CString
还具有内置函数来帮助加载字符串并转换为BSTR
等,所有这些都是预制的,并且已经构建为可以与Windows一起使用。因此,虽然您需要对一种格式进行标准化,但为什么不让它更容易使用?
答案 2 :(得分:3)
std :: wstring可以更加轻松,并且可以从STL和boost中的许多现有预编写代码中受益。使用Windows API,CString可能会更好。
wchat_t:记住你可以随时使用data()函数从wstring中获取数据,所以无论如何你都可以获得所需的wchar_t指针。
BSTR:使用SysAllocString从wstring.data()获取BSTR。
至于平台依赖性,请记住,您可以使用std::basic_string<T>
根据您想要的单个字符的长度来定义自己的字符串。
我每天都会去wstring ....