在VC ++中处理字符串的最佳实践?

时间:2010-03-12 06:42:19

标签: c++ string visual-c++ mfc

由于我是Visual C ++的新手,因此处理字符串的类型非常多。当我使用某种类型并继续编码但是在下一步时,有使用其他类型的内置函数&它总是需要将一种类型的字符串转换为其他字符串。我发现这么多的博客,但是当看到这么多的答案时,我很困惑。尝试,但有些正在工作&有些不是。

请提供您的答案或链接,为在visual c ++中处理不同类型的字符串提供最终解决方案。

4 个答案:

答案 0 :(得分:5)

这取决于你在做什么。它是一种痛苦,无论你做什么,你将不得不处理转换。

  • 在大多数情况下,std :: string类几乎可以满足任何需求,并且任何习惯于c ++的人都可以轻松阅读。

  • 如果您使用MFC cstring将是最常见和正常的选择

  • 对于C ++ Cli System :: String是标准

  • 所有带有字符串的windows api都会使用null终止的cstyle字符串,但是根据你正在使用的框架工作,你可能不必直接调用很多APi,特别是如果你使用.net

  • 我相信在ATL中还有另外几个字符串类,但我没有太多使用该库。

答案 1 :(得分:2)

Win32系统API在LPCWSTR上运行(指向C样式的NULL终止的wchar_t数组)。 系统头文件提供每个API的两个版本,例如SetWindowTextA(HWND,LPCSTR)和SetWindowTextW(HWND,LPCWSTR)以及宏映射SetWindowText()到相关的版本,具体取决于项目中UNICODE的定义,即:

#ifdef UNICODE
#define SetWindowText  SetWindowTextW
#else
#define SetWindowText  SetWindowTextA
#endif // !UNICODE 

SetWindowTextA()API将从它的LPCSTR参数构建一个临时LPCWSTR并调用操作代码所在的SetWindowTextW(),因此在代码中不使用UNICODE和wchar_t会导致性能下降。

COM接口设计用于在BSTR上运行,BSTR是分配给不同进程之间共享的系统。

很高兴BSTR可以从LPCWSTR构建,MS编译器提供_bstr_t类:_bstr_t myBstr(/ LPCWSTR / psText)。

ATL :: CString和MFC CString类(共享其大部分代码)使用相同的宏机制并映射到CStringA或CStringW。两者都有内置运算符(CStringA :: operator LPCSTR()CStringW :: operator LPCWSTR()),因此您可以将CString传递给Win32 API:

CString myStr = _T("Hello");
::SetWindowText(myHwnd, myStr);

std :: [w] string没有这样的内置运算符,但c_str()成员也没有这样做:

std::wstring myStr = L"Hello"; // assuming UNICODE defined
::SetWindowText(myHwnd, myStr.c_str());

要点:

  1. 在所有项目中定义UNICODE以避免Win32平台上的性能损失。

  2. 如果您使用MFC,您自然会使用它的CString类,如果您使用ATL或者没有,您可以使用ATL :: CString,这是一个独立的类(#include <atlstr.h>不包括ATL库)或std :: wstring 。
  3. 如果必须使用std :: wstring。
  4. ,则必须使用其他系统

答案 2 :(得分:0)

另外,请阅读http://www.codeproject.com/KB/string/cppstringguide2.aspx以及该系列的其余部分,以了解C ++中的字符串处理。是的,这很糟糕,这是(IMO)C ++最糟糕的缺点之一。

答案 3 :(得分:0)

在我看来,有两种方法可以去。使用STL std :: string或std :: wstring。或者使用MFC CString。如果我正在编写MFC代码,我总是使用CString。如果您的系统已设置为使用它,则默认情况下允许您使用unicode。然而,据说有很多旧的C / C ++函数不喜欢unicode CStrings使用的基础数据类型。他们中的大多数总是有宽版本,这是找到正确版本使用的问题。 CStrings还拥有大量预先构建的功能; IMO甚至超过了std ::(w)字符串。

如果您计划进行任何COM开发,还有BSTR,但我之前很少使用这种类型的字符串。