14 November 2023

C++ 核心指南目录

“Use using namespace directives for transition, for foundation libraries (such as std), or within a local scope (only)”

理由

using namespace 可能会导致名字冲突,所以应该少用用。然而,我们也很难在用户代码中写全每个名字空间。有时候,在代码中名字空间太普遍了,以至于,没法一直用,不然的话,就太繁琐、影响注意力了。

例子

#include <string>
#include <vector>
#include <iostream>
#include <memory>
#include <algorithm>

using namespace std;

// ...

这里,很显然,到处都要用到了标准库,也没有用到其他库,所以要求每个地方都添加 std:: 就显得太繁琐了。

例子

用上 using namespace std; 有可能会导致代码中的变量名和标准库冲突。

#include <cmath>
using namespace std;

int g(int x)
{
    int sqrt = 7;
    // ...
    return sqrt(x); // error
}

不过,一般不太会出现这种错误,会用 using namespace std 的人,一般也熟悉 std ,也知道这个风险。

注意

.cpp 文件是一种局部范围的形式。变量名冲突发生的概率在以下两种情况里没太大差别:

  • N 行的 .cpp 文件里有个 using namespace X
  • N 行的函数中有一个 using namespace X
  • M 个函数,每个函数中包含了 using namespace X ,总的代码行数是 N 行