VC++中处理字符串的最佳实践是什么?

3
作为一个Visual C++的新手,有很多种处理字符串的类型。当我使用某些类型并继续编码时,在下一步中会发现内置函数使用其他类型,而且总是需要将一种字符串类型转换为另一种类型。我找到了很多博客,但是当看到这么多答案时感到困惑,尝试了一些方法,有些能够工作,有些则不能。
请给出您的答案或链接,以便在Visual C++中处理不同类型的字符串的最终解决方案。
4个回答

5
这取决于你正在做什么。不管你怎么做都必须处理转换,这很繁琐。
对于大多数情况,std::string类几乎可以满足任何需求,并且易于阅读,特别是对于习惯于c++的人。
如果你正在使用MFC,则cstring是最常见和正常的选择。
对于C++ Cli System :: String是标准的。
所有接受字符串的Windows API都希望使用以空字符结尾的C风格字符串,但是根据你使用的框架,你可能不需要直接调用许多API,特别是如果你使用.net。
我相信在ATL中还有另外几个字符串类,但我没有经常使用过该库。

2
只是为了澄清,CString现在是MFC和ATL之间的“共享”类(即,您可以使用CString而不必引入MFC框架):http://msdn.microsoft.com/en-us/library/zzs00fs6.aspx - Michael Burr
此外,如果使用Windows API,您可能希望使用16位宽字符,即std::wstring而不是std::string。 - Rune Aamodt

2

Win32系统API的操作基于LPCWSTR(wchar_t类型的C风格空字符结尾数组的指针)。 系统头文件提供每个API的两个版本,例如SetWindowTextA(HWND, LPCSTR)和SetWindowTextW(HWND, LPCWSTR),并提供一个宏将SetWindowText()映射到相应的API,取决于项目中UNICODE的定义,即:

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

SetWindowTextA() API将从其LPCSTR参数构建临时LPCWSTR,并调用SetWindowTextW(),因此在代码中不使用UNICODE和wchar_t会导致性能损失。

COM接口旨在操作系统分配的BSTR之上,以便在不同进程之间共享。

令人高兴的是,可以使用MS编译器提供的_bstr_t类从LPCWSTR构建BSTR:_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。

0

0
在我看来,有两种方法可供选择。使用STL std::string或std::wstring。或者使用MFC CString。如果我正在编写MFC代码,我总是使用CString。它可以让您默认使用unicode,如果您的系统设置为使用它。但是话虽如此,有很多旧的C/C++函数不喜欢unicode CStrings使用的底层数据类型。它们大多都带有wide版本,只需找到正确的版本即可使用。CStrings还具有大量预构建的功能;在我看来,甚至比std ::(w)string更多。
如果您计划进行任何COM开发,还有BSTR,但我很少使用该类型的字符串。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接