在C ++ API上公开的基本类型

时间:2011-02-27 19:24:11

标签: c++ visual-c++ api-design

我的目标是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 ++编译器的兼容性
  • 性能(对我来说这是一个较小的问题,但需要启动我的应用程序的剩余时间)

任何指南都将不胜感激。

3 个答案:

答案 0 :(得分:2)

你应该坚持使用STL字符串类型。无论如何,MFC CString类建立在现在的基础之上。

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

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

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

答案 1 :(得分:1)

在您的情况下,我需要花费几个小时/天来制定意见并做出决定。首先,我非常喜欢C_API到C ++ _ AP​​I,即使对于C ++代码也是如此。然后答案是char *,或wchar *,或TCHAR *。现在,试着猜测你是否真的需要UNICODE。我的绝大多数项目(包括那些带有GUI的项目)都不需要UNICODE,普通C阵列的简单性和熟悉性通常很难被击败。

简而言之,尽量预测您的需求是什么,不要试图将未来看得太远(2年是一个好标记),然后提出最简单的解决方案来满足需求。

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

答案 2 :(得分:1)

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

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