【问题标题】:Should I use CString, basic_string<TCHAR>, or something else with ATL/WTL?我应该在 ATL/WTL 中使用 CString、basic_string<TCHAR> 还是其他东西?
【发布时间】:2011-11-04 17:57:11
【问题描述】:

这几天我只学了一点ATL(在意识到纯Win32有多痛苦之后),还了解了WTL和MFC,据我所见,有很多不同的字符串适合我的课程。

做了这样的事情:

#include <tchar.h>
#include <string>
namespace std { typedef basic_string<TCHAR> _tstring; }

然后在我的代码中到处使用_tstring。在学习了一些ATL之后,我了解到atltmp.h中有一个CString类。显然,WTL 中还有另一个 CString 类,还有一个 MFC 中的 CString 类。

不知道我是否会坚持使用 ATL,或者我是否会切换到 WTL、MFC 或其他方式。但是现在,我正在将我的 Win32 代码转换为 ATL,我不确定要更改什么以及保留什么。

我应该让我的字符串使用CString 而不是_tstring?考虑到可执行文件大小(不包括共享库)可移植性/兼容性,这样做有什么好处吗?

【问题讨论】:

  • 唯一可以合法添加到std命名空间的是模板特化。另外,我不了解WTL,但是ATL和MFC中的CString类是一样的,它们都是CSimpleStringT的typedef(我认为)
  • @Praetorian:嗯,我不介意在个人项目中从事这种非侵入性的非法活动。 :P
  • 第一次了解 CString 时,我在 Google 上查找了它。事实证明,NSFW。
  • @Toolbox:哦,哈哈,我从来没有尝试过(我总是这样做CString class)。谢谢你的提醒。 XD
  • @Praetorian : CString 在 ATL 和 MFC 中确实是相同的,但是 ATL 被认为是规范所有者(毕竟它在命名空间 ATL 中......)。我记得 WTL 没有自己的——我认为它只是使用 ATL。

标签: c++ string mfc atl wtl


【解决方案1】:

对于 ATL / MFC / WTL,我的偏好是坚持使用 CString。无论如何,如果您使用这些框架,那么您就没有太多可移植性的选择。你知道他们在说什么:When in Rome ...

另外,CString 确实有一些细节

  • 您可以使用CString::LoadString 从可执行文件中加载资源字符串
  • 使用CString::GetBuffer/ReleaseBuffer 直接访问内部字符串缓冲区
  • CStringACStringW 之间静默转换
  • 使用CString::Format 执行类似printf 的格式化

【讨论】:

  • 您也可以访问basic_string 的内部缓冲区——只需执行&amp;str[0]。但我特别喜欢第 3 点和第 4 点——毕竟我想我可能会喝清凉剂。 +1
  • 哦,问题:使用CString 是否会对可执行文件大小产生明显影响?我不希望它会,但我不想仅仅为了更改字符串类而将 100 KiB 添加到 80 KiB 的可执行文件中。
  • 如果您使用静态链接的 MFC,您一开始的大小为 3000 kB,所以没关系。 :->
  • 此外,CStrings 被引用计数,使得复制成本低。 (msdn.microsoft.com/en-us/library/…) 我还没有看到一个 std::string 被引用计数(我不知道标准是否允许这样做)。
  • @Andrew Stein C++03 不禁止 std::string 的引用计数实现;不了解 C++0x。另外,我记得在某处读到 libstdc++ 确实为 std::string 实现了引用计数
【解决方案2】:

我刚刚读到的是CString 不支持空字符。

我想我会继续使用 STL。

【讨论】:

    猜你喜欢
    • 2017-05-22
    • 1970-01-01
    • 2014-02-10
    • 2011-06-11
    • 1970-01-01
    • 1970-01-01
    • 2011-04-03
    • 2011-02-02
    • 1970-01-01
    相关资源
    最近更新 更多