【问题标题】:Best practices for handling string in VC++?在 VC++ 中处理字符串的最佳实践?
【发布时间】:2010-03-12 06:42:18
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    这取决于你在做什么。这是一种痛苦,无论你做什么,你都必须处理转换。

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

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

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

    • 所有接受字符串的 windows api 都需要空终止的 cstyle 字符串,但是根据您使用的框架,您可能不必直接调用许多 APi,尤其是在使用 .net 时

    • 我相信 ATL 中还有另外几个字符串类,但我没有经常使用那个库。

    【讨论】:

    • 澄清一下,CString 现在是 MFC 和 ATL 之间的“共享”类(即,您可以在不引入 MFC 框架的情况下使用 CString):msdn.microsoft.com/en-us/library/zzs00fs6.aspx跨度>
    • 另外,如果使用 Windows API,您可能需要使用 16 位宽的字符,即 std::wstring 而不是 std::string。
    【解决方案2】:

    Win32 系统 API 在 LPCWSTR(指向 Wchar_t 的 C 风格 NULL 终止数组的指针)上运行。 系统头文件提供每个 API 的两个版本,例如 SetWindowTextA(HWND, LPCSTR) 和 SetWindowTextW(HWND, LPCWSTR) 以及根据项目中 UNICODE 的定义将 SetWindowText() 映射到相关的宏,即:

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

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

    COM 接口设计用于在 BSTR 上运行,这些 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。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        在我看来,有两条路可以走。使用 STL std::string 或 std::wstring。或使用 MFC CString。如果我正在编写 MFC 代码,我总是使用 CString。如果您的系统设置为使用它,它默认允许您使用 unicode。然而,话虽如此,有很多旧的 C/C++ 函数不喜欢 unicode CStrings 使用的底层数据类型。他们中的大多数总是有广泛的版本,这是找到要使用的正确版本的问题。 CStrings 也有大量的预建功能。 IMO 甚至超过 std::(w)string。

        如果您打算进行任何 COM 开发,也可以使用 BSTR,但我以前很少使用这种类型的字符串。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多