CppCoreGuidelines SF.6 在过渡期,基础的库可以用 using namespace,而其他则限制在局部范围使用
14 November 2023
“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 行