使用"std"的标准惯例

Nik*_*ale 11 c++ using

完全重复: 您更喜欢C++中的显式名称空间还是"使用"?

以下哪一项是使用任何命名空间的首选约定?

using namespace std;
Run Code Online (Sandbox Code Playgroud)

要么

using std::cin;
using std::cout;
Run Code Online (Sandbox Code Playgroud)

要么

在代码中需要时调用函数?

std::cout<<"Hello World!"<<std::endl;
Run Code Online (Sandbox Code Playgroud)

mis*_*tor 14

这里给出一个非常好的解释.

第一种风格,即使用命名空间,无论如何都会破坏命名空间的整个目的.除了小代码片段之外,你永远不应该使用它.(我也不在那里使用它!:D)

第二个是太冗长了.不实用.

我个人喜欢第三种风格,即输入完全限定名称(例如std :: cout).

请记住,代码的读取次数比使用完全限定的名称读取的次数多得多,IMO使代码更具可读性.

  • @Chris:这是我在原帖中发布的Marshall Cline链接:"我个人觉得输入"std ::"比对每个不同的std名称决定是否包括使用 - 更快声明,如果是这样,找到最佳范围并将其添加到那里." (8认同)
  • 编程中任何概念的目的都是为程序员提供更轻松的生活.如果您正在大量使用标准库,那么"使用"可以使您的代码更加简洁.怎么用`std :: string; 字符串a; 串b; 字符串c; 字符串d`比`std :: string a更详细; std :: string b; std :: string c; std :: string d;`?如果你必须经常使用它,那么完全限定的名称会变得很麻烦.而且严重的是,当已经有一个`std :: string`时,谁会手动编写自己的`string`类?如果你说`string x` 95%的时候它是'std :: string`而且每个人都知道它. (6认同)
  • 不同意:我没有看到在源文件中使用`namespace std;`有任何问题.但绝不要在头文件中使用#1或#2. (6认同)

小智 12

之前已经多次询问过,但我的SO搜索似乎暂时抛弃了我.基本上:

  • 永远不要在头文件中放置任何类型的using指令 - 这样做会污染您的代码并引入各种难以追踪的错误.

  • 首选使用声明,例如using std::string,在大量使用此类型的实现(.cpp)文件中.

  • 作为最后的手段,请使用using namespace std,但仅限于实现文件 - 为方便起见,我在SO上的可编译代码帖子中使用它.

  • 什么是"小"?我没有编写巨大的类,但我也没有把C++标准库中的每个名字都记在脑后.明确指定我经常使用的名称可以避免令人讨厌(并且非常非常难以调试)的问题. (2认同)

Yac*_*oby 8

这是我在同一主题上写的另一个答案的修改版本.足够这些问题,也许我最终会得到一个明确的帖子;)

主要问题是名称冲突,因为如果你的代码中有一个名为cout的变量using namespace std;,那么你的意思就是模棱两可.这不仅仅是cout.count,reverse并且equal也将包括在内,这都是常见的标识符.

无视编译器的所有问题,任何人来阅读您的代码也是一个问题.这些额外的5个字符可确保维护代码的下一个人确切知道您的意思.


值得注意的是,你永远不应该放

using namespace std;
Run Code Online (Sandbox Code Playgroud)

在头文件中,因为它可以传播到包含该头文件的所有文件,即使他们不想使用该命名空间.这里的另一个问题是,还不清楚std命名空间是否已被导入,因此维护者(或者你在3个月的时间内)添加了一个变量,其名称与包含在同一编译单元中的一些模糊的std函数相同.然后花费一个小时试图找到编译错误的原因.

在大多数情况下,使用像这样的东西是非常有益的

using std::swap
Run Code Online (Sandbox Code Playgroud)

好像有一个专门版本的swap,编译器将使用它,否则它将依赖于std::swap.如果你打电话std::swap,你总是使用基本版本,它不会调用专用版本(即使它存在).

pimpl成语为例.默认副本可以复制实际实现中的所有数据,其中所有需要做的就是交换指针.使用专门的交换可以节省大量的执行时间,精心设计的库应该专门化它.


综上所述,

  • 总是喜欢using std::swapstd::swap()

  • 避免using namespace std在由于传播的所有费用头,尽量避免在实现文件中使用它.

  • using std::foo每个文件的顶部有数千个不是要走的路.最多使用它用于常用类.

其他一切都是意见.