2009-12-03 80 views
2

我正在編寫一個庫,並想知道公共API中使用的數據類型的最佳做法是什麼。在公共C++ API中的類型

鑑於功能

void foo (int bar) 

它期望的索引一些內部陣列/容器。應該是什麼類型?因爲索引永遠不會是負數,所以我可以使用unsigned int或size_t。或者,如果提供了一些無效值,我應該堅持使用純int和斷言/拋出?

一般情況:我應該根據有效的數據範圍選擇一種類型(例如爲了避免負面檢查)嗎?

編輯:另一個例子,假設我的庫提供了打印文件的功能。用戶可以選擇要打印的頁面範圍:

void print (int page_from, int page_to) 

回答

2

如果您正在討論的數組/容器只是一個通用的抽象應用程序無關數組,那麼最適合的類型將是size_t。當然,您可以在界面中爲該類型提供一個typedef名稱。再次,這隻適用於使用抽象數組(如通用容器庫或通用排序函數等)。

您進入應用程序特定區域時,size_t不再是適當的類型。在您的應用程序特定區域,該索引通常會有一些特定於應用程序的語義不與數組直接相關。例如,它可以是某種類型的「員工ID」,或「單元號」或「顏色索引」或其他。在這種情況下,您通常會有一個預選的整數類型來表示相應的數量。 (而且選擇通常與數組無關。)這正是您應該在界面中使用的類型。

至於類型的符號/無符號...我堅信無符號數應該用無符號類型表示,即正常數組索引應該是無符號的。

+0

+1:爲數字應該表示的數量創建一個typedef。 – avakar 2009-12-03 09:29:53

1

這裏最好的建議很可能會去與現行做法(即什麼C++標準庫這樣做)。一般來說,這意味着至少在這裏使用unsigned類型;如果實際上直接使用該類型作爲數組/指針索引(並且抽象在這方面是透明的),那麼可能會調用size_t

如果foo是一些類容器類的成員函數,那麼你也可以考慮typedef就像size_type一樣,並使用它。

0

我投票使用無符號。更好的是,使用stdint.h並使用像uint32_t之類的東西。

+0

在C++中沒有'stdint.h',即使存在,使用固定大小的類型也是錯誤的。你可以有一個超過2 ** 32個元素的數組。 (誰說640kB的內存對任何人都足夠了?) – avakar 2009-12-03 09:27:24

+0

我不是建議使用32位整數,你也可以使用uint64_t, m建議*知道*變量的大小。 – Drakosha 2009-12-03 09:51:13

+1

謝謝你的鏈接。正如我所說,C++中沒有'stdint.h'。 :)(它被添加到C99中,目前的C++標準是基於C90的,下一版C++標準將引入'stdint.h'。至少有一個主要的C++編譯器不支持它 - msvc)。無論如何,我認爲修改變量的大小並不是一個好主意,尤其是當它們涉及內存中的索引或大小時(它有超出所有限制的趨勢)。我想我們都在64位繁榮期間學到了這一課。 – avakar 2009-12-03 12:41:59