7

我的目标是 Windows,但我看不出为什么我正在编写的某些 API 代码不能使用基本的 C++ 类型。我想要做的是公开返回字符串和整数的方法。在 C# 世界中,我只使用字符串,并拥有一个 unicode 字符串,但在 VC++ 中,我可以选择使用 std::string、std::wstring 或 MFC/ATL CStrings。

我应该只使用 std::wstring 来支持 unicode,还是可以使用 std::string 根据我的构建设置编译为 unicode?我倾向于后者。我更愿意在我的对象上为其他字符串类型提供 Get[Item]AsCString() 方法。

我还应该使用 size_t 而不是整数吗?

该 API 将由我使用,也许未来的开发人员将使用 C++ GUI。这是一种分离关注点的方法。我的偏好:

  • 对其他开发人员的直观性。
  • 与 VC++ 的前向兼容性
  • 与其他 C++ 编译器的兼容性
  • 性能(这对我来说不太重要,但我的应用程序的其余部分需要启动时间)

任何指南将不胜感激。

4

3 回答 3

2

您可能应该坚持使用 STL 字符串类型。无论如何,MFC CString 类现在都建立在此之上。

如前所述,使用 wstring 并不是解决 Unicode 问题的灵丹妙药,因为仍有许多 Unicode 字符需要多个 wchar 进行编码。

使用 Utf-8 具有潜在的好处(例如,您不必担心字节顺序)。

在 Windows 上,所有现代内核都是基于 wchar 的,因此如果您使用 8 位 char 版本的 API,则会产生(最小)性能开销。

于 2011-02-28T07:56:54.340 回答
1

使用 std::wstring/string 代替 MFC CString 将允许您将代码移植到其他框架(例如 Qt for Windows)。

即使在使用 std::string 时,您也可以将字符串编码为 UTF-8,因此您的 API 仍然能够返回 UNICODE 字符串。请记住,即使 wstring 实际上是 UTF-16 而不是完整的 32 位 UNICODE(而在某些操作系统上 wstring 是 UTF-32)。

于 2011-02-27T21:14:10.703 回答
1

在您的情况下,我需要几个小时/几天才能形成意见并做出决定。首先,我非常喜欢 C_API 而不是 C++_API,即使对于 C++ 代码也是如此。那么答案将是 char*、wchar* 或 TCHAR*。现在,尝试猜测您是否真的期望需要 UNICODE。我的大部分项目(包括那些带有 GUI 的项目)都不需要 UNICODE,普通 C 数组的简单性和熟悉性通常很难被击败。

简而言之,试着预测你的需求,不要把未来看得太远(2年是个好标记),然后想出最简单的解决方案来满足需求。

最后:为了更直接地回答您的问题,我将从 std::string 作为我评估的第一选择开始。除非我能找到一些有利于其他选择的出价优势,否则我会坚持下去。

于 2011-02-27T20:24:12.503 回答