size_t在哪里定义?

时间:2018-07-24 14:06:11

标签: c++ types namespaces size-t global-namespace

所以我知道C Compatability Headers中的任何标头:

  

在全局名称空间中放置对应的cxxx标头应放在std名称空间中的每个名称

我还知道,自起,已弃用了这些C头,以支持它们的兼容性“ cxxx”。

现在,我相信size_t仅由Standard Defines Header定义。因此,我认为从技术上讲,这意味着不赞成使用全局命名空间中的size_t定义?

我已经使用size_t多年了,我想先确认一下,然后再使用std::size_t

4 个答案:

答案 0 :(得分:6)

  

我认为从技术上讲,这意味着不赞成使用全局命名空间中的size_t定义?

是...但是。

该标准仅规定必须由std::size_t定义<cstddef> 1 ,它并不禁止实现::size_t 2 ,但如果实现,两个定义必须匹配 3

结论是,您应该使用std::size_t,并且不应依赖::size_t进行定义或对其进行定义。

以下是UB:

// DON'T
using size_t = std::size_t;        // UB
using size_t = decltype(sizeof 1); // UB

1) [cstddef.syn]

namespace std {
    using ptrdiff_­t = see below;
    using size_­t = see below;
    using max_­align_­t = see below;
    using nullptr_­t = decltype(nullptr);
     

[...]
  头文件<cstddef>的内容和含义与C标准库头文件<stddef.h>相同,除了它不声明类型wchar_­t,还声明了类型{{1 }}及其相关操作(byte),并在[support.types.byteops][support.types.nullptr]中进行了说明。

2) [extern.types]/1

  

对于C标准库中的每种类型[support.types.layout](这些类型为[...] T,[...]。),类型size_­t和{{ 1}}保留给实现[。]

3) [extern.types]/1

  

[...]定义时,::​T应与std​::​T相同。

答案 1 :(得分:3)

不推荐使用

C样式的标头名称,例如<stddef.h>。但是,允许<cstddef>之类的C ++样式标头在全局名称空间中声明其名称,然后通过 using-declarations ({{3} }。不建议使用这种声明标准名称的方法。而且许多实现正是这样做的,因此,将名称std作为可从全局名称空间访问的名称并不罕见。但这不能保证。因此,在包含size_t的可移植C ++代码中,您应该使用<cstddef>,并且永远不要依赖std::size_t的可用性。

答案 2 :(得分:2)

标准说[expr.sizeof]

  

sizeofsizeof...的结果是类型为std​::​size_­t的常量。 [注意:std​::​size_­t在标准标题<cstddef>中定义([cstddef.syn],[support.types.layout])。 —尾注]

答案 3 :(得分:0)

  

在哪里定义了size_t?

保证 ::size_t <stddef.h>中定义,以及由c ++继承的其他几个C标准库头文件。实现可以 定义是否包含任何内容,因为它是保留的,但是依靠这样的非保证定义是不明智的。

  

所以我认为这从技术上讲意味着不赞成使用全局命名空间中的size_t定义?

的确。更准确地说,现在保证在C ++ 17中弃用所有保证定义::size_t的标准标头。同样适用于所有其他非宏C库名称,例如::FILE