之间有什么区别size_t
和std::size_t
,当他们要使用,任何其他差异化功能在他们的声明,其中条款?
之间有什么区别size_t
和std::size_t
,当他们要使用,任何其他差异化功能在他们的声明,其中条款?
Answers:
C size_t
和C ++ std::size_t
都相同。
在C中,它是<stddef.h>
在C ++中定义的,在C ++中,其定义<cstddef>
与C头相同(请参见下面的引号)。其定义为无符号整数类型的的结果的的的sizeof运算符。
C标准在§17.7/ 2中说,
为size_t其是无符号整数类型的的结果的的的sizeof操作者
C ++ Standard cstddef
在§18.1/ 3中说(关于标题),
内容与标准C库标头相同,但有以下更改。
是的,两者都是一样的。唯一的区别是C ++ size_t
在std
名称空间中定义。
另请注意,上面的行还显示了“进行了以下更改” ,这并不是指size_t
。它宁可指的是C ++对语言(C中不存在)所做的新添加(大部分),这些添加也定义在同一标头中。
Wikipedia具有有关size_t的范围和存储大小的非常好的信息:
size_t的范围和存储大小
size_t 的实际类型与 平台有关;一个常见的错误 是假定size_t与unsigned int相同,例如,当从32位架构转换为64位架构时,可能会导致编程错误[3] [4]。
根据1999 ISO C标准(C99),size_t是至少16位的无符号整数类型。
您可以在Wikipedia的此页面上阅读其余内容。
size_t
不使用using namespace std;
或,这是错误的using std::size_t;
。但是,大多数编译器都允许它,并且标准专门允许他们允许它(§D.5/ 3)。
<cstddef>
可以声明也可以不声明::size_t
,因此您不能依赖它的存在或不存在,除非明确包含<stddef.h>
了C库中另一个保证可以声明它的标头。
::size_t
例如存在于中<stddef.h>
,因此您不必总是用来限定它std::
。
从C ++ 03“ 17.4.3.1.4类型”开始:
对于标准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
所定义的变体吗?
#include <stddef.h>
那么std::size_t
可能会或可能无法使用。如果您#include <cstddef>
当时std::size_t
有空,但size_t
可能没有。
std::
并且该段落说,它也可以在顶级名称空间中定义它们,如果是,则必须在std::
和顶级中相同地定义它们。大多数编译器仅包含C头并将名称导入std::
,因此最终两个符号中都定义了符号。
std::
来自C岸的标识符的变体。我坚持使用<xxxxx.h>
标准C标头-从来没有问题。因此,我会使用<stddef.h>
并且size_t
永远不会考虑std::size_t
;实际上,我永远不会想到存在(或可能存在)std::size_t
。
std :: 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
。
<stddef.h>
只会得到你::size_t
。
<cstddef>
那么std::size_t
您一定会得到保证,而且您也可能会得到::size_t
(但不能保证)。如果包括在内,<stddef.h>
您肯定::size_t
会得到,而且您也可能会得到std::size_t
(但不保证)。它在C ++ 03中有所不同,但实际上无法实现,并已作为缺陷修复。