关于size_t和offset_t用法的指导原则?

时间:2009-07-31 21:01:15

标签: c++

这可能是一个C ++ 101问题:我很好奇使用size_toffset_t的准则是什么,例如他们打算用于什么情况,他们不打算用于什么情况等等。我没有做过很多可移植编程,所以我通常只使用像intunsigned int这样的数组大小,索引等。但是,我认为最好在可能的情况下使用其中一些更标准的typedef,所以我想知道如何正确地做到这一点。

作为后续问题,对于使用Visual Studio 2008在Windows上进行开发,我应该在哪里查找实际的typedef?我发现VS安装目录中的许多标题中都定义了size_t,因此我不确定应该使用哪些标题,而且我无法在任何地方找到offset_t

5 个答案:

答案 0 :(得分:12)

您可能指的是off_t,而不是offset_toff_t是POSIX类型,而不是C类型,它用于表示文件偏移(即使在32位系统上也允许64位文件偏移)。 C99取代了fpos_t

size_t用于计算字节或数组元素。它匹配地址空间。

答案 1 :(得分:3)

而不是offset_t你的意思是ptrdiff_t吗?这是std::distance等例程返回的类型。我的理解是size_t是无符号的(以匹配前面提到的地址空间)而ptrdiff_t是有符号的(理论上表示指针之间的“向后”距离,尽管这很少使用)。

答案 2 :(得分:1)

在我的C ++标准副本中根本没有提到

offset_t

另一方面,

size_t仅表示对象或数组大小。保证size_t足够大以存储任何内存中对象的大小,因此应该使用它。

答案 3 :(得分:1)

只要C ++语言规范指出它在特定表达式中使用,就使用size_t。例如,您使用size_t来存储sizeof的返回值,或者表示数组中元素的数量(new[]需要size_t)。

我不知道offset_t是什么 - 在ISO C ++规范中没有提到过一次。

答案 4 :(得分:0)

将一个旧版本拖回来... offset_t(这是一个很长的版本)被Solaris&#39; llseek()系统调用,可用于任何可能遇到真正的64位文件偏移的地方......这意味着您正在使用真正巨大的文件。< / p>