如何处理size_t与std :: size_t?

时间:2017-03-14 21:54:35

标签: c++ size-t

刚读完:

Does "std::size_t" make sense in C++?

当你::size_t时,我意识到使用#include <cstddef>不符合标准(虽然我的编译器支持)。我想遵守标准,但我不想在我std::的所有size_t之前添加using std::size_t;。那么,处理这个问题的习惯/流行方式是什么:

  • <stddef.h>
  • 包括194.242.103.139
  • 只依靠编译器支持?
  • 别的什么?

2 个答案:

答案 0 :(得分:6)

您应该使用using指令指定它。

using std::size_t;

将其添加到每个编译单元的全局范围,或者添加到本地范围,如果它会在全局范围内造成干扰。

正如你所指出的,stddef.h也有效,老实说这种方法并不比这个方法“差”。但是,stddef.h是一个向后兼容标头,最好避免在新代码中依赖它。

我更喜欢using指令,因为它不会在任何你不需要的地方污染全局命名空间,也不依赖于任意编译器对非标准行为的支持。此外,这是在多个选项可能的情况下将类型引入命名空间的普遍接受的方式,因此它对于size_t的使用并不是唯一的。

这不是一个人可以权威地回答的问题。我已经成为一名专业开发人员已有10年了,并且自1998年以来一直使用C ++,但我永远不会看到任何已编写的C ++代码中有统计意义的部分。从我所看到的,有很多代码仍然使用stddef.h,它不会很快破坏。

对于新代码,我更喜欢在任何地方键入“std ::”前缀,只在它变得繁琐或难以阅读时才应用using指令。但是,我认识到这可能会让“继承”代码感到恼火,这是使用指令的文件范围更好的地方。如果你有时间正确地重构继承的代码,那么你应该这样做是一个很好的论据,但它很可能只涉及size_t变量。

我还应该提到C ++ FAQ(第27.5项)也提到了这个问题here,我得到的印象是他们主要建议与团队中的其他人保持一致。

我想在此注意,在文件范围应用“using namespace std”并不是一个好习惯,尽管这也会将size_t带入全局命名空间。我将链接原因here

我似乎吓坏了tuple_cat(抱歉),但我确实认为他的经验方法很好,所以我试图通过一些改变来解决我对他的回答的担忧。我尝试使用以下修改过的查询来搜索github,但这仍然可能存在一些问题:

A) "size_t" AND "stddef.h" language:c++
B) "std::size_t" AND "<cstddef>" language:c++
C) "size_t" AND "<cstddef>" AND NOT "std::size_t" language:c++
D) "size_t" AND "<cstddef>" AND "using namespace std" AND NOT "std::size_t" language:c++
E) "size_t" AND "<cstddef>" AND "using std::size_t" language:c++

我得到以下内容:

  • A)974,239结果(stddef.h方法)
  • B)1,230,021结果(cstddef方法,带有“std ::”前缀)
  • C)469,721结果(cstddef方法,没有前缀)
  • D)32,539结果(cstddef方法,“使用命名空间标准”,不要这样做!
  • E)27,080个结果(我推荐的方法,“使用std :: size_t”)

这绝对不是完美的,我欢迎批评让它变得更好,但似乎我推荐的方法,如上所述,并不是最受欢迎的。基于数据,似乎最流行的是在size_t(B)上使用“std ::”前缀,然后包括“stddef.h”(A)。幸运的是,(D)的糟糕方法并不受欢迎,但似乎很多人可能依赖其他文件/头来将size_t带入全局命名空间,或者只是希望它已经存在于编译器(C)中。

因此,要“与群一起去”,你应该用“std ::”前缀所有内容。如果你不想这样做,那么“stddef.h”也很常用,但我的偏好仍然是using指令。

答案 1 :(得分:3)

  

那么,处理这个问题的习惯/流行方式是什么:

以下是确定这一点的一种方法:

GitHub search for "std::size_t" in C++ code:4,650,049个结果 GitHub search for "size_t" in C++ code:24,835,033结果。

同样地,"#include <stddef.h>"给出了1,051,142次点击,而"#include <cstddef>"给出了2,099,971次。搜索"using std::size_t;"只会得到50,057个结果。

把这个放在这里,做出自己的结论。