10

可能重复:
为什么是“使用命名空间标准;” 在 C++ 中被认为是一种不好的做法?

前几天,当我问一个问题时,有人回答说如果有人问一个问题,请向他们展示正确的方法,而不是using namespace std;我认为这有点奇怪,因为这样using namespace std;更容易,但我想我现在失败了我是一名“初学者”编码员,你们知道得更好。

所以我想我的问题是:为什么std::而不是using namespace std;

谢谢。

4

6 回答 6

21

来自 C++ 常见问题解答:

我应该using namespace std在我的代码中使用吗?

可能不是。

人们不喜欢std::一遍又一遍地打字,他们发现这 using namespace std会让编译器看到任何std名字,即使是不合格的。美中不足的是,它让编译器可以看到任何 std名称,甚至是您没有想到的名称。换句话说,它会造成名称冲突和歧义。

https://isocpp.org/wiki/faq/coding-standards#using-namespace-std

于 2011-03-29T07:15:21.110 回答
4

简而言之,您不太可能错误地使用错误的类型或函数,或者名称冲突。假设您正在使用自己的数学库和 std,并以任意顺序使用它们两者进行声明。现在,它们都定义了函数 pow。当您调用 pow 时,您使用的是哪个 pow?我认为额外的打字是值得的。

于 2011-03-29T07:17:48.627 回答
2

我认为更有经验的程序员不会使用显式命名空间,参见例如Do you prefer explicit namespaces or 'using' in C++?

但是请注意,您永远不应该在头文件中导入命名空间,并且在某些情况下显式命名空间更清晰,例如使用函数std::min()std::max()

于 2011-03-29T07:18:14.337 回答
1

我认为这是一些偏好的事情。有些人喜欢在使用类时看到显式的命名空间。一个例外是我从不在头文件中使用 using namespace std。因为这可能会意外地改变使用此头文件的类的行为。

于 2011-03-29T07:18:25.233 回答
0

有经验的程序员使用任何能解决他们问题的方法,并避免任何产生新问题的方法。

因此,出于显而易见的原因,它们避免了头文件级别的使用指令。

他们试图避免在源文件中完全限定名称。次要的一点是,在没有充分理由的情况下编写更多代码并不优雅。重点是关闭 ADL。

这些好的理由是什么?有时您明确希望关闭 ADL。有时你想消除歧义。

所以以下是可以的:1)函数实现中的函数级使用指令和使用声明;2) 源文件中的源文件级使用声明;3)(有时)源文件级使用指令。

于 2011-03-29T07:57:44.800 回答
0

命名空间是我们变量的附加限定符。假设我们在中std定义了“字符串”,现在如果我们在mynamespace还定义了“字符串”。

现在,如果我写using namespace std;在文件的顶部,那么从那里开始,一个字符串对于编译器来说就变得模棱两可了。

但是,可以采取一种中间方法,严格不using namespace std;包含在 header(.h) 文件中,因为其他人可能想要使用您的类并且可能会发生冲突。而对于实现(.cxx)文件,如果您确定不会有任何冲突,则可以小心使用它。

于 2011-03-29T07:17:39.537 回答