我使用哪种宽字符串结构? CString vs wstring

时间:2010-01-03 15:56:00

标签: string com mfc cstring wstring

我在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);

3 个答案:

答案 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 ....