166

它们在声明的位置、应在何时使用以及任何其他区别特征之间有什么size_t区别?std::size_t

4

3 回答 3

105

Csize_t和C++std::size_t都是一样的。

在 C 中,它是<stddef.h>在 C++ 中定义的,其定义<cstddef>的内容与 C 头文件相同(参见下面的引用)。其定义为sizeof运算符结果无符号整数类型

C 标准在 §17.7/2 中说,

size_t 是sizeof运算符结果符号整数类型

C++ 标准cstddef在 §18.1/3 中说(关于标题),

内容与标准 C 库头文件相同,但有以下更改

所以,是的,两者都是一样的;唯一的区别是 C++size_tstd命名空间中定义。

另请注意,上述行还说“进行以下更改” ,而不是指size_t. 它更确切地说是指 C++ 对语言(C 中不存在)所做的新添加(大部分),这些添加也定义在同一个标​​题中。


维基百科有关于 size_t 的范围和存储大小的非常好的信息:

size_t的范围和存储大小

size_t的实际类型 取决于平台;一个常见的错误 是假设 size_t 与 unsigned int 相同,这可能会导致编程错误,[3][4] 例如,从 32 位架构迁移到 64 位架构时。

根据 1999 ISO C 标准 (C99),size_t 是至少 16 位的无符号整数类型。

其余的你可以在维基百科的这个页面上阅读。

于 2011-04-28T04:47:22.193 回答
18

来自 C++03“17.4.3.1.4 类型”:

对于标准 C 库(脚注 169)中的每个类型 T,类型 ::T 和 std::T 保留给实现,并且在定义时,::T 应与 std::T 相同。

脚注 169:

这些类型是clock_t、div_t、FILE、fpos_t、lconv、ldiv_t、mbstate_t、ptrdiff_t、sig_atomic_t、size_t、time_t、tm、va_list、wctrans_t、wctype_t和wint_t。

于 2011-04-28T04:59:15.133 回答
16

std::size_t实际上是stddef.hsize_t

cstddef给出以下内容:

#include <stddef.h>
namespace std 
{
  using ::ptrdiff_t;
  using ::size_t;
}

...有效地将先前的定义带入 std 命名空间。

于 2011-04-28T04:55:51.887 回答