让我们说我必须接受一个大小作为处理数组的接口的参数。对于e.x。
void doSomethingRelatedToArrays(const size_t length)
在这里,我使用size_t并考虑以下因素:
但是,我不应该在我的接口中使用无符号类型,因为客户端可以传入负数,这是隐式转换为无符号数,我没有办法在我的方法中验证它。请参阅Scott Meyer关于此主题的文章here。
所以,我应该将有符号整数类型传递给API。但是如何在系统中获得最大的有符号整数类型?是否有任何类似于size_t的typedef被签名?或者我应该只使用size_t?
答案 0 :(得分:5)
签名的等效size_t
只是ssize_t
,但是这种类型在C99标准中没有定义,即使许多编译器都知道它。
对于C99标准,最大有符号整数类型定义为intmax_t
。
参考:7。Library / 7.18整数类型/ 7.18.1.5最大宽度整数类型
答案 1 :(得分:3)
要使用的标准类型是std::intmax_t
,它在<cstdint>
中定义。要获得最大值,您可以使用std::numeric_limits<intmax_t>::max()
。
示例代码:
#include <cstdint>
#include <iostream>
#include <limits>
int main(int argc, char* argv[]) {
std::cout << "max size = " << std::numeric_limits<intmax_t>::max() << std::endl;
}
答案 2 :(得分:2)
但是如何才能获得系统中最大的有符号整数类型?
在C ++ 11的<cstdint>
中,您可以找到类型intmax_t
,它是在C标准(7.20.1.5)之后定义的:
以下类型指定能够执行的有符号整数类型 表示任何有符号整数类型的任何值
是否有任何类似于size_t的typedef被签名?
不,不是在C ++标准中。 POSIX定义ssize_t
,但:
size_t
(其本身也受到POSIX的限制)
ssize_t
应能够存储至少在[-1,{SSIZE_MAX}]范围内的值。
所以,我应该将有符号整数类型传递给API。 (...)或者我应该 只需使用size_t?
如果您的接口是为了处理C ++数组,那么size_t
是标准保证能够保存任何可能的数组索引的唯一类型。使用任何其他类型(理论上)可能无法处理所有数组(甚至在您链接的文章中都会注明)。
因此,使用size_t
进行索引是常见且习惯的 - 并且被许多库(包括STL)使用。
答案 3 :(得分:1)
最近C和C ++标准中最大的有符号整数类型是long long
。在类型宽于long long
之前,您始终可以使用它。如果您希望更加面向未来,请使用intmax_t
中最大的无符号整数类型的类型
size_t
始终是系统
这是不正确的。 32位系统中的size_t
通常也是32位,这显然不是最宽的类型。它只能保证足够大,以表示系统中最大对象的大小。
如果需要size_t
,ptrdiff_t
可以用作已签名的对应方。但它也不是最大的类型。
对于
同义char
以下的PTRDIFF_MAX
个数组,std::ptrdiff_t
充当std::size_t
的已签名对应数据:它可以存储任何类型数组的大小,并且大多数平台,与std::intptr_t