我在C ++使用的std :: string和std :: wstring的MFC应用程序,以及从一个到另一个频繁广播,和很多其他无义的。我需要知道的一切规范,以一个单一的格式,所以我想知道我是否应该用的CString或std :: wstring的走了。

在应用程序中,我需要从一个字符串表生成的字符串,用了很多的要求常量TCHAR或wchar_t的指针,编辑控件,以及互动与COM对象的API,需要BSTR Windows调用工作。

我还有一个字符串矢量,所以有与CStrings的矢量任何问题?

哪个更好?什么各自的利弊?

实施例

BSTR到wstring的

CComBSTR tstr;  
wstring album;  
if( (trk->get_Info((BSTR *)&tstr)) == S_OK  && tstr!= NULL)  
    album = (wstring)tstr;

的wstring到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);
有帮助吗?

解决方案

的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还具有格式(),其虽然不是安全和有点难看,是方便的。如果你喜欢安全的格式化库,你会和basic_string的更好。

此外,具有CString的一些算法作为成员函数,您需要升压字符串工具用于向上basic_string的如微调做,分割等

CString的的载体是没有问题的。

警惕的CString它是Windows的唯一的基础上教条解雇:如果您在Windows GUI使用它,应用程序仅Windows反正。话虽这么说,如果有任何机会,你的代码需要跨平台的未来,你会被固定在basic_string的<>。

其他提示

我个人对于这种情况下CStrings去,因为你的状态,你有BSTRs工作,使用COM,并在MFC写的。虽然wstrings会更符合标准,你会碰到与不变从一个到另一个转换的问题。既然你用COM工作,并在MFC写它,有没有真正的理由担心使得跨平台的,因为没有其他操作系统有COM像Windows和MFC已经锁定你进入Windows。

正如你指出,CStrings还具有内置的功能,以帮助负载串并转换为BSTRs之类的,所有预先制作和已建工作与Windows。所以,当你需要在一个格式规范,为什么不更容易的工作?

的std :: wstring的会更便携,并从STL和提升了很多现有的预先写好的代码的好处。 CString的可能会与Windows的API去好了。

wchat_t:记住,你可以通过使用数据()函数获得数据出wstring的任何时间的,这样就可以获得所需要的指针wchar_t的反正

BSTR:使用SysAllocString得到BSTR出wstring.data的()

对于平台Dependance的,记住,你可以使用std::basic_string<T>来定义自己的字符串,根据你想要的单个字符的长度为。

我会去wstring的每一天......

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top