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

Van*_*ril 7 string com mfc cstring wstring

我在C++中有一个使用std :: string和std :: wstring的MFC应用程序,并经常从一个转换为另一个,还有很多其他的废话.我需要将所有内容标准化为单一格式,所以我想知道是否应该使用CString或std :: wstring.

在应用程序中,我需要从字符串表生成字符串,处理大量需要常量tchar或wchar_t指针的Windows调用,编辑控件,并与需要BSTR的COM对象API进行交互.

我也有字符串向量,所以CStrings向量有什么问题吗?

哪一个更好?各自的优点和缺点是什么?

例子

BSTR到wstring

CComBSTR tstr;  
wstring album;  
if( (trk->get_Info((BSTR *)&tstr)) == S_OK  && tstr!= NULL)  
    album = (wstring)tstr;
Run Code Online (Sandbox Code Playgroud)

wstring到BSTR

CComBSTR tstr = path.c_str();  
if(trk->set_Info(tstr) == S_OK)
    return true;
Run Code Online (Sandbox Code Playgroud)

字符串资源到wstring

CString t;
wstring url;
t.LoadString(IDS_SCRIPTURL);
url = t;
Run Code Online (Sandbox Code Playgroud)

GetProfileString()返回一个CString.

整数到字符串格式:

wchar_t total[32];
swprintf_s(total, 32, L"%d", trk->getInt());
wstring tot(total);
Run Code Online (Sandbox Code Playgroud)

Roe*_*oel 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的矢量没问题.

防止基于Windows仅对CString进行教条式解雇:如果您在Windows GUI中使用它,则无论如何该应用程序都是仅限Windows的.话虽如此,如果您的代码将来有可能需要跨平台,那么您将会遇到basic_string <>.


Jos*_*hua 9

CString在这种情况下,我个人会选择s,因为你声明你正在BSTR使用COM,并使用COM,并在MFC中编写它.虽然wstrings会更符合标准,但你会遇到不断从一个转换到另一个的问题.由于您正在使用COM并将其编写在MFC中,因此没有理由担心将其设置为跨平台,因为没有其他操作系统具有类似Windows的COM,并且MFC已经将您锁定到Windows中.

正如您所指出的那样,CStrings还具有内置函数来帮助加载字符串并转换为BSTRs等,所有这些都是预制的并且已经构建为可以与Windows一起使用.因此,虽然您需要对一种格式进行标准化,但为什么不让它更容易使用?