所以我知道C Compatability Headers中的任何标头:
在全局名称空间中放置对应的cxxx标头应放在
std
名称空间中的每个名称
我还知道,自c++17起,已弃用了这些C头,以支持它们的兼容性“ cxxx”。
现在,我相信size_t
仅由Standard Defines Header定义。因此,我认为从技术上讲,这意味着不赞成使用全局命名空间中的size_t
定义?
我已经使用size_t
多年了,我想先确认一下,然后再使用std::size_t
。
答案 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
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]
中进行了说明。
对于C标准库中的每种类型
[support.types.layout]
(这些类型为[...]T
,[...]。),类型size_t
和{{ 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]
:
sizeof
和sizeof...
的结果是类型为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
。