size_t和std :: size_t之间的区别

Man*_*rse 123 c++ size-t

之间有什么区别size_tstd::size_t,当他们要使用,任何其他差异化功能在他们的声明,其中条款?

Naw*_*waz 80

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++ 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位的无符号整数类型.

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

  • @Als:严格来说,如果没有`using namespace std;`或`using std :: size_t;`,那么说`size_t`是错误的.但是,大多数编译器都允许它,标准特别允许它们允许它(§D.5/ 3). (37认同)
  • @Potatoswatter:当然它既不是错误也不是标准中特别允许的?如果它在标准中,那不是错误! (8认同)
  • @BenHymers该标准指定标准头部声明的内容,并且不允许它们声明任何其他非保留名称.标题`<cstddef>`可能会也可能不会声明`:: size_t`,所以你不能依赖它存在或不存在,除非特别包括`<stddef.h>`或来自C库的另一个标题保证宣布它. (6认同)
  • @Potatoswatter:啊,我明白你的意思了!我一定会被一句话中的太多"允许"搞糊涂了.我仍然认为你的第一个评论太强了; 正如你刚才所说,`:: size_t`存在于例如`<stddef.h>`中,所以你并不总是需要用`std ::`来限定它. (4认同)
  • 这就带来了另一个问题,如果STL已经通过C(cstddef)导入了size_t,为什么它又拥有自己的另一个版本? (2认同)

Mic*_*urr 17

从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.

  • @Mankarse:你不应该依赖它们被定义*if*你只包含相应标题的C版本.如果你#include <stddef.h>`那么`std :: size_t`可能会也可能不会.如果你#include <cstddef>`那么`std :: size_t`可用,但`size_t`可能不是. (3认同)
  • @Mankarse:对面.头文件的C++版本必须在`std ::`中定义它们,并且段落说它也可以在顶级命名空间中定义它们,如果是,它必须在`std ::`和顶层中相同地定义它们.大多数编译器只包含C头并将名称导入`std ::`,因此符号最终在两者中定义. (3认同)
  • 就个人而言,我从不打扰来自C shore的<cxxxxx>标头或标识符的`std ::`变体.我坚持使用`<xxxxx.h>`作为标准C头文件 - 它从来都不是问题.所以,我使用`<stddef.h>`和`size_t`并且永远不再考虑`std :: size_t`; 事实上,它永远不会让我觉得有(或可能是)`std :: size_t`. (2认同)

hif*_*ier 13

std :: size_t实际上是stddef.hsize_t.

cstddef给出以下内容:

#include <stddef.h>
namespace std 
{
  using ::ptrdiff_t;
  using ::size_t;
}
Run Code Online (Sandbox Code Playgroud)

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

  • @MSalters,因为C++ 11不准确.如果你包含`<cstddef>`,你肯定会得到`std :: size_t`,你也可能得到`:: size_t`(但不能保证).如果包含`<stddef.h>`,你肯定会得到`:: size_t`,你也可能得到`std :: size_t`(但不保证).它在C++ 03中有所不同,但它实际上是无法实现的并且被修复为缺陷. (8认同)
  • @MSalters,我没有关注.包括`<stddef.h>`只能得到`:: size_t`. (4认同)
  • @MSalters,我不太关注.不应该反过来吗?<cstddef>来自C++,因此应该在std ::*中定义东西?另一方面,在一个C头文件中,比如stddef.h,我只期望C类型,即:: size_t. (4认同)
  • 那是你实现中的一个错误. (2认同)