我正在编写一个库,并想知道在公共API中使用的数据类型的最佳实践是什么。
鉴于功能
void foo (int bar)
期望索引到某个内部数组/容器。那应该是什么类型的?因为索引永远不会是负数,所以我可以使用unsigned int或size_t。或者,如果提供了一些无效值,我应该坚持使用普通的int并断言/抛出吗?
一般情况下:我应该根据有效数据范围选择类型(例如,为了避免否定支票)?
编辑:另一个例子,假设我的库提供了打印文件的功能。用户可以选择要打印的页面范围:
void print (int page_from, int page_to)
答案 0 :(得分:2)
如果您正在讨论的数组/容器只是一个通用的抽象应用程序独立数组,那么最合适的类型将是size_t
。当然,您可以为界面中的类型提供typedef
名称。同样,这只适用于使用抽象数组,例如通用容器库或通用排序函数等。
您进入特定于应用程序的区域,size_t
不再是合适的类型。在特定于应用程序的区域中,索引通常会有一些与数组不直接相关的特定于应用程序的语义。例如,它可以是某种“员工ID”,或“单元格号”或“颜色索引”或其他东西。在这种情况下,您通常已经预先选择了整数类型来表示相应的数量。 (并且选择通常与数组无关。)这正是您应该在界面中使用的类型。
至于类型的签名/无符号......我坚信无符号数量应该用无符号类型表示,即普通数组索引应该是无符号的。
答案 1 :(得分:1)
这里最好的建议可能是采用现有的做法(即C ++标准库的作用)。从广义上讲,这意味着至少在这里使用unsigned
类型;如果您实际上直接将该类型用作数组/指针索引(并且您的抽象在这方面是透明的),那么可能会调用size_t
。
如果foo
是某个类容器类的成员函数,那么您也可以考虑使用typedef
之类的size_type
,并使用它。
答案 2 :(得分:0)
我投票赞成使用未签名的。更好的是,使用stdint.h并使用类似uint32_t的东西。