7

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

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

我也有字符串向量,那么 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);
4

3 回答 3

11

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 执行诸如修剪、拆分等。

CString 的向量没有问题。

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

于 2010-01-04T17:24:06.703 回答
9

在这种情况下,我个人会使用CStrings,因为您声明您正在使用BSTRs,使用 COM,并在 MFC 中编写它。虽然wstrings 会更符合标准,但您会遇到不断从一个转换到另一个的问题。由于您正在使用 COM 并在 MFC 中编写它,因此没有真正的理由担心使其跨平台,因为没有其他操作系统像 Windows 那样具有 COM,而 MFC 已经将您锁定在 Windows 中。

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

于 2010-01-04T17:32:02.600 回答
3

std::wstring 将更加可移植,并受益于 STL 和 boost 中的许多现有预编写代码。CString 可能会更好地使用 Windows API。

wchat_t :请记住,您可以随时使用 data() 函数从 wstring 中获取数据,因此无论如何您都可以获得所需的 wchar_t 指针。

BSTR:使用 SysAllocString 从 wstring.data() 中获取 BSTR。

至于平台依赖性,请记住,您可以std::basic_string<T>根据您希望单个字符的长度来定义自己的字符串。

我每天都会去wstring....

于 2010-01-03T16:00:10.873 回答