【问题标题】:proper style for interfacing with legacy TCHAR code与遗留 TCHAR 代码交互的正确样式
【发布时间】:2011-03-15 13:46:37
【问题描述】:

我正在修改广泛使用 TCHAR 的其他人的代码。在我的代码中只使用 std::wstring 是不是更好的形式? wstring 应该等同于 Widechar 平台上的 TString,所以我没有看到问题。理由是,使用原始 wstring 比支持 TCHAR 更容易......例如,使用 boost:wformat。

下一个维护者会更清楚哪种风格?我自己浪费了几个小时试图理解复杂的字符串,似乎只使用 wstring 会切断你需要理解的一半内容。

typedef std::basic_string<TCHAR> TString; //on winxp, TCHAR resolves to wchar_t
typedef basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> > wstring;

...唯一的区别是分配器。

在不太可能的情况下,您的程序 登陆 Window 9x 机器,有 仍然是可以翻译的 API 层 将 UTF-16 字符串转换为 8 位字符。 使用 TCHAR 没有意义了 用于新代码开发。 source

【问题讨论】:

  • 您到底关心什么?如果您有任何二进制不兼容,C++ 编译器和链接器都会通知您。如果这纯粹是一种风格问题,请将自己置于代码的下一个维护者的位置,并选择对最有意义的类型名称。跨度>

标签: c++ windows winapi wchar-t tchar


【解决方案1】:

如果您只打算针对 Unicode (wchar_t) 平台,最好使用 std::wstring。如果你想支持多字节和 Unicode 构建,你需要使用 TString 和类似的。

还要注意,根据传入的字符类型,basic_string 默认 char_traits 和分配器为 1,因此在构建 UNICODE(或 _UNICODE,我永远记不起哪个)时,TString 和 wstring 将是相同的。

注意:如果您只是将参数传递给各种 API,而不对它们进行任何操作,则最好直接使用 const wchar_t * 而不是 std::wstring(尤其是在混合 Win32、COM 和标准 C++ 代码时)因为您最终会减少转换和复制。

【讨论】:

    【解决方案2】:

    TCHAR 曾经在您编译两次二进制文件时更为重要,一次用于 char,另一次用于 wchar_t。

    如果您愿意,您仍然可以做出此选择,将 MSVC 项目设置从 MBCS 更改为 Unicode 并返回。

    这也意味着在调用 windows API 时,您将拥有匹配的数据类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-19
      • 2010-11-18
      • 1970-01-01
      • 2012-06-23
      • 1970-01-01
      • 1970-01-01
      • 2011-06-11
      • 1970-01-01
      相关资源
      最近更新 更多