size_t
和std::size_t
有何不同之处?C的size_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++在std
命名空间中定义了size_t
。
请注意上面的那一行还说了"有以下更改",它并不是指size_t
,而是指C++向语言中添加的新内容(大多数是C中没有的),这些新内容也在同一个头文件中定义。
维基百科对size_t
的范围和存储大小有很好的信息:
至少16位的整数类型。
size_t
的范围和存储大小
size_t
的实际类型是平台相关的;一个常见的错误是假设size_t
与unsigned int
相同,这可能导致编程错误[3][4],例如从32位到64位架构的转换。根据1999年的ISO C标准(C99),
size_t
是一个无符号整数类型。它通常被用作内存分配函数中的参数和返回值类型,以及其他需要表示对象大小的地方。
剩余部分可以从维基百科此页面中阅读。
using namespace std;
或using std::size_t;
就使用size_t
是一个错误。然而,大多数编译器允许这样做,并且标准特别允许它们允许这样做(§D.5/3)。 - Potatoswatter<cstddef>
可能会声明 ::size_t
,因此您不能指望它存在或不存在,除非特别包括 <stddef.h>
或另一个保证声明它的 C 库头文件。 - Potatoswatter::size_t
在 <stddef.h>
中也存在,所以你并不总是需要用 std::
来限定它。 - Ben Hymers来自C++03的“17.4.3.1.4 Types”:
对于标准C库中的每种类型T(注169),类型:: 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。
std::T
变量吗? - Mankarse<stddef.h>
头文件,那么std::size_t
可能可用或不可用。如果你包含了<cstddef>
头文件,那么std::size_t
可用,但size_t
可能不可用。 - Dennis Zickefoosestd::
中定义它们。该段落说,它也可以在顶级命名空间中定义它们,如果这样做,它必须在 std::
和顶级命名空间中以相同的方式定义它们。大多数编译器只包含 C 头文件并将名称导入到 std::
中,因此符号最终会在两个命名空间中都被定义。 - Jan Hudecstd::
前缀的标识符。我仅使用标准C头文件 <xxxxx.h>
,这从未成为过问题。因此,在代码中我使用 <stddef.h>
和 size_t
,并从未考虑过std::size_t
;事实上,我从未想过存在(或可能存在)一个std::size_t
。 - Michael Burrstd::size_t实际上是stddef.h中的size_t。
cstddef提供如下内容:
#include <stddef.h>
namespace std
{
using ::ptrdiff_t;
using ::size_t;
}
...有效地将之前的定义引入了std命名空间。
<cstddef>
并期望得到::size_t
,但如果你包含<stddef.h>
,你将得到std::size_t
。 - MSalters<stddef.h>
只会得到::size_t
。 - hifier<cstddef>
头文件,你就可以保证得到std::size_t
,并且你可能也会得到::size_t
(但不能保证)。如果你包含了<stddef.h>
头文件,你就可以保证得到::size_t
,并且你可能也会得到std::size_t
(但不能保证)。在C++03中是不同的,但那实际上无法实现,并被作为一个缺陷进行了修复。 - Jonathan Wakelycstddef
将定义std::size_t
,但它可能会或可能不会引入::size_t
(既不要求也不禁止)。即使实现引入了::size_t
,也可以通过在namespace std
中放置using ::size_t;
或在全局命名空间中放置using std::size_t;
来实现,无法保证实现将使用哪种方法。 - Pharap