公共c ++ API中的类型

时间:2009-12-03 07:33:32

标签: c++ api types

我正在编写一个库,并想知道在公共API中使用的数据类型的最佳实践是什么。

鉴于功能

void foo (int bar)

期望索引到某个内部数组/容器。那应该是什么类型的?因为索引永远不会是负数,所以我可以使用unsigned int或size_t。或者,如果提供了一些无效值,我应该坚持使用普通的int并断言/抛出吗?

一般情况下:我应该根据有效数据范围选择类型(例如,为了避免否定支票)?

编辑:另一个例子,假设我的库提供了打印文件的功能。用户可以选择要打印的页面范围:

void print (int page_from, int page_to)

3 个答案:

答案 0 :(得分:2)

如果您正在讨论的数组/容器只是一个通用的抽象应用程序独立数组,那么最合适的类型将是size_t。当然,您可以为界面中的类型提供typedef名称。同样,这只适用于使用抽象数组,例如通用容器库或通用排序函数等。

您进入特定于应用程序的区域,size_t不再是合适的类型。在特定于应用程序的区域中,索引通常会有一些与数组不直接相关的特定于应用程序的语义。例如,它可以是某种“员工ID”,或“单元格号”或“颜色索引”或其他东西。在这种情况下,您通常已经预先选择了整数类型来表示相应的数量。 (并且选择通常与数组无关。)这正是您应该在界面中使用的类型。

至于类型的签名/无符号......我坚信无符号数量应该用无符号类型表示,即普通数组索引应该是无符号的。

答案 1 :(得分:1)

这里最好的建议可能是采用现有的做法(即C ++标准库的作用)。从广义上讲,这意味着至少在这里使用unsigned类型;如果您实际上直接将该类型用作数组/指针索引(并且您的抽象在这方面是透明的),那么可能会调用size_t

如果foo是某个类容器类的成员函数,那么您也可以考虑使用typedef之类的size_type,并使用它。

答案 2 :(得分:0)

我投票赞成使用未签名的。更好的是,使用stdint.h并使用类似uint32_t的东西。