std::basic_string<TCHAR> 在 Windows 上会比 std::wstring 更可取吗?

Posted

技术标签:

【中文标题】std::basic_string<TCHAR> 在 Windows 上会比 std::wstring 更可取吗?【英文标题】:Would std::basic_string<TCHAR> be preferable to std::wstring on Windows? 【发布时间】:2009-06-05 15:28:51 【问题描述】:

据我了解,Windows #defines TCHAR 作为基于构建的应用程序的正确字符类型 - 所以它在 UNICODE 构建中为 wchar_t,否则为 char

因此我想知道std::basic_string&lt;TCHAR&gt; 是否比std::wstring 更可取,因为理论上第一个匹配应用程序的字符类型,而第二个总是很宽。

所以我的问题本质上是:std::basic_string&lt;TCHAR&gt; 在 Windows 上会比 std::wstring 更可取吗?而且,使用std::basic_string&lt;TCHAR&gt; 是否有任何警告(即意外行为或副作用)?或者,我应该在 Windows 上使用 std::wstring 并忘记它吗?

【问题讨论】:

【参考方案1】:

我相信,建议发布应用程序的非 unicode 版本(以支持 Win95,或节省一两个 KB)的时代已经过去:如今,您将支持的底层 Windows 系统将是基于 unicode(因此使用基于 char 的系统接口实际上会通过插入库中的 shim 层来使代码复杂化)并且您是否会节省任何空间是值得怀疑的。加油std::wstring,年轻人!-)

【讨论】:

+1 因为原始原因:在 Windows 上,Unicode 通过 wchar_t。在仅限 Windows 的代码上使用 char 字符是非常愚蠢的。我知道。我使用带有代码页的字符和 10 种语言的本地化字符串来处理一个非常大的应用程序...... Eew...... +1 宣讲!我曾经对这种观点非常重视,以至于听到其他人也有同样的想法真是太好了。【参考方案2】:

我在非常大的项目上做过这个,效果很好:

namespace std

#ifdef _UNICODE
    typedef wstring tstring;
#else
    typedef string tstring;
#endif

您可以在任何地方使用 wstring,但如果您愿意,如果您不需要使用多字节字符串进行编译。我认为您不需要在任何现代应用程序中支持多字节字符串。

注意:std 命名空间应该是禁止使用的,但多年来我对上述方法没有任何问题。

【讨论】:

同样,虽然我当时可能没有把它放在 std 命名空间中。 从技术上讲,将其添加到 std 命名空间是不合法的。 :) 我怀疑许多编译器实际上会抱怨它,但 std 命名空间在技术上是不受限制的。您唯一可以添加的内容是现有模板的特化。 MSVC 不会抱怨它应该做的几件事。即 typename 关键字的使用(或缺少)。 +1。我使用类似的结构来生成支持 Unicode 的代码,这些代码可以在 Windows (wchar_t) 和 Linux (char) 上运行。我了解 std 命名空间是禁止使用的,因此,如果我自己的 std::tstring 是我的代码出现问题的原因,我同意为此付出代价。我还没有看到问题。现在,对于当前的问题,我建议,对于仅限 Windows 的代码,继续使用 std::wstring 嗯,为什么不直接typedef std::basic_string&lt;TCHAR&gt; tstring【参考方案3】:

要记住的一件事。如果您决定在您的程序中一直使用 std::wstring,如果您使用 UTF8 与其他系统通信,您可能仍需要使用 std::string。

【讨论】:

如果您混合使用宽字符串和 UTF8 字符串,则无论如何都不能依赖 TCHAR。

以上是关于std::basic_string<TCHAR> 在 Windows 上会比 std::wstring 更可取吗?的主要内容,如果未能解决你的问题,请参考以下文章

将 std::basic_string<Char> 转换为字符串

std::basic_string<TCHAR> 在 Windows 上会比 std::wstring 更可取吗?

错误 C3867 'std::basic_string<char,std::char_traits<char>,std::allocator<char>>::c_s

传递给 std::basic_string 的分配器能否将其方法设为虚拟

VS错误C++:不存在从 "WCHAR [260]" 转换到 "std::basic_string<char," 的适当构造函数

no suitable ctr exists to convert from 'int' to 'std::basic_string<char,std::char_tra