【发布时间】:2015-10-28 12:43:03
【问题描述】:
假设我必须接受一个大小作为处理数组的接口的参数。例如
void doSomethingRelatedToArrays(const size_t length)
在这里,我使用size_t 是出于以下考虑:
- 长度必须始终为正数
-
size_t总是类型定义为系统中最大的无符号整数类型。std::size_t可以存储理论上可能的任何类型对象的最大大小。
但是,我不应该在我的接口中使用无符号类型,因为客户端可以传入一个负数,该负数会隐式转换为无符号数,并且我无法在我的方法中验证它。请参阅 Scott Meyer 关于此主题的文章 here。
所以,我应该将有符号整数类型传递给 API。但是我怎样才能得到系统中最大的有符号整数类型呢?是否有任何类似于size_t 的typedef 已签名?还是我应该改用size_t?
【问题讨论】:
-
POSIX 有
ssize_t。 -
注意:C 确实没有 定义“size_t 总是被类型定义为系统中最大的无符号整数类型”。
uintmax_t是更好的候选“无符号整数类型,能够表示任何无符号整数类型的任何值” -
std::make_signed_t<std::size_t> -
Scott Meyer 文章,关于数组大小,很容易错误地使有效的大数组大小失败。尽管与不正确的负尺寸相比,这肯定不是一个常见的问题,但它只是将一个错误检测换成了另一个。如果参数是[INTMAX_MIN...INTMAX_MAX]中的整数,使用
intmax_t,否则如果在[0...UINTMAX_MAX]范围内,使用uintmax_t,如果是FP,使用long double,如果是布尔值,使用@ 987654335@等 -
size_t的签名对应物可能是ptrdiff_t,但它仍然不是最大的整数类型
标签: c++ c signed unsigned-integer size-t