【问题标题】:Types in a public c++ API公共 c++ API 中的类型
【发布时间】:2009-12-03 07:33:32
【问题描述】:

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

给定函数

void foo (int bar)

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

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

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

void print (int page_from, int page_to)

【问题讨论】:

    标签: c++ api types


    【解决方案1】:

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

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

    至于类型的有符号/无符号......我坚信无符号数量应该由无符号类型表示,即正常的数组索引应该是无符号的。

    【讨论】:

    • +1:为数字应该代表的数量创建一个typedef。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • C++ 中没有stdint.h,即使有,使用固定大小的类型也是错误的。您可以拥有一个包含超过 2**32 个元素的数组。 (谁说 640kB 的内存对任何人都应该足够了?)
      • en.wikipedia.org/wiki/Stdint.h> 我不建议使用 32 位整数,你也可以使用 uint64_t,我建议知道你的变量的大小。
      • 感谢您的链接。正如我所说,C++ 中没有stdint.h。 :) (它被添加到 C99,当前的 C++ 标准基于 C90。C++ 标准的下一个修订版将引入stdint.h。至少一个主要的 C++ 编译器还不支持它——msvc)。无论如何,我认为固定变量的大小不是一个好主意,尤其是当它们引用内存中的索引或大小时(它有增长超出所有限制的趋势)。我以为我们都在 64 位热潮中吸取了这一教训。
      • @Drakosha 我建议您不要关心变量的 确切 大小,只要它们“足够大”即可。这通常意味着使用 int 或 long,并让编译器在给定的硬件上选择最有效的表示,可能会添加一些编译时断言,这些类型可以包含所需的值范围。
      猜你喜欢
      • 2011-02-14
      • 1970-01-01
      • 1970-01-01
      • 2020-03-18
      • 1970-01-01
      • 2012-11-10
      • 2016-04-30
      • 1970-01-01
      相关资源
      最近更新 更多