2011-02-27 25 views
7

我针对的是Windows,但我没有看到任何理由说明为什么我正在编写的一些API代码无法使用基本的C++类型。我想要做的是公开返回字符串和整数的方法。在C#世界中,我只是使用字符串,并有一个Unicode字符串,但在VC++中,我可以选择使用std :: string,std :: wstring或MFC/ATL CString。要在C++ API上公开的基本类型

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

也应该使用size_t而不是整数?

这个API将会被我使用,也许是一个将来在C++ GUI上工作的开发者。这是区分顾虑的一种方式。我的偏好:

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

任何导游,将不胜感激。

+1

这种风格的项目配置实际上取决于项目的目的等。一切都有它的地方,这就是为什么某些方面不被简单地弃用。 'std :: string'是我见过的最常见的用法(尽管我已经见过'wchar_t'等等的unicode),并且如果你正在测量某个东西的大小,请使用'size_t'。 – RageD 2011-02-27 19:30:13

回答

1

在你的情况下,我需要几个小时/几天来制定一个意见和决定。首先,我非常喜欢C_API到C++ _ AP​​I,即使是C++代码也是如此。然后答案将是char *,或wchar *,或TCHAR *。现在,试着猜测你是否真的期望需要UNICODE。我的绝大多数项目(包括那些使用GUI的项目)都不需要UNICODE,简单的C阵列的简单性和熟悉程度往往难以超越。总之,试着预测你的需求是什么,不要试图去看待未来(2年是一个好的标志),然后拿出最简单的解决方案来满足需求。

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

1

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

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

2

你应该坚持STL字符串类型。无论如何,MFC CString类是建立在当今时代之上的。

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

使用Utf-8反而有潜在的好处(例如,您不必担心排序问题)。

在Windows上,所有现代内核都是基于wchar的,所以如果使用8bit char版本的API,则涉及(最小)性能开销。