"std :: size_t"在C++中有意义吗?

jwf*_*arn 58 c++ size-t

在一些代码,我继承,我看到经常使用size_tstd命名空间限定词.例如:

std::size_t n = sizeof( long );
Run Code Online (Sandbox Code Playgroud)

当然,它编译并运行良好.但对我来说这似乎是不好的做法(也许是从C继承下来的?).

是不是真的size_t是内置到C++中,因此在全局命名空间中?是否需要size_t在C++中使用头文件?

提出这个问题的另一种方法是,是否需要在所有C++编译器上编译以下程序(没有包含)?

size_t foo()
{
    return sizeof( long );
}
Run Code Online (Sandbox Code Playgroud)

Joh*_*itb 130

对于这种情况,stackoverflow人群之间似乎存在混淆

::size_t在向后兼容标头中定义stddef.h.它一直的一部分,ANSI/ISO C并且ISO C++因为其本身的开始.每个C++实现都必须附带stddef.h(兼容性)cstddef,只有后者定义std::size_t,而不一定::size_t.参见C++标准的附录D.

  • 绝对是这里最好的答案.它基于标准而不是特定的编译器.它回答了原始问题而没有偏离切线. (13认同)
  • 不使用`using namespace std`的另一个原因 (3认同)
  • C++11 标准说 cstddef 应该定义 stddef.h 所做的一切,包括 ::size_t。所以我认为没有理由使用 std::size_t 而不是 size_t。请参阅“18.2.2: <сstddef> 内容与标准 C 库头文件 <stddef.h> 相同,但有以下更改...” 这里没有关于 ::size_t 的缺失。 (2认同)

Don*_*eld 41

C++标准第17.4.1.2节第4段规定:

"但是,在C++标准库中,声明和定义(除了在C中定义为宏的名称除外)都在命名空间std的命名空间范围(3.3.5)内."

这包括在模式cname的头文件中找到的项目,包括定义size_t的cstddef.

所以std :: size_t实际上是正确的.


fiz*_*zer 13

size_t例如,您可以通过包含<stddef.h>代替而来获取全局命名空间<cstddef>.我看不到任何明显的好处,并且该功能已被弃用.

  • 除了我认为@fizzer正在解释你如何*最终在你的C++程序中以全局命名空间结束size_t,而不是建议你*做*. (5认同)