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<TCHAR>
是否比std::wstring
更可取,因为理论上第一个匹配应用程序的字符类型,而第二个总是很宽。
所以我的问题本质上是:std::basic_string<TCHAR>
在 Windows 上会比 std::wstring
更可取吗?而且,使用std::basic_string<TCHAR>
是否有任何警告(即意外行为或副作用)?或者,我应该在 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<TCHAR> 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