2011-02-27 32 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,則涉及(最小)性能開銷。