如何处理size_t与std :: size_t?

ein*_*ica 10 c++ size-t

刚读过:

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

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

  • using std::size_t;
  • 包括<stddef.h>
  • 只是依靠编译支持?
  • 别的什么?

Bob*_*ler 7

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

using std::size_t;
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

我还要提到的是,C++ FAQ(项目27.5)中提到这一问题,以及在这里,在这里我得到的印象是,他们大多建议在你的团队与其他人保持一致.

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

我似乎吓坏了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++
Run Code Online (Sandbox Code Playgroud)

我得到以下内容:

  • 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指令.


eml*_*lai 5

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

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

GitHub 搜索"std::size_t"C++ 代码:4,650,049 个结果。
GitHub 搜索"size_t"C++ 代码:24,835,033 个结果。

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

就放在这里吧,你自己下结论吧。

  • “using std::size_t”并不是唯一将 size_t 引入命名空间的 using 指令。另一种方法是“使用命名空间 std”,我怀疑这相当常见。这里不是批评:你有一个经验方法,我只是想帮助你找出可以尝试堵塞的漏洞,以使答案更好。 (2认同)
  • @BobMiller `using namespace std;` 通常是不好的做法,不应该在全局范围内使用。 (2认同)
  • @user2176127 我绝对同意。我提到它是因为这是一种将 size_t 引入全局名称空间的不同方法,上面的搜索不会捕获该名称空间。另外,#include 搜索的问题在于 &lt;cstddef&gt; 不仅仅包含 size_t,因此很难从这些结果中判断用户是否为了将 size_t 引入命名空间而包含它。 (2认同)