前几天,当我问一个问题时,有人回答说如果有人问一个问题,请向他们展示正确的方法,而不是using namespace std;
我认为这有点奇怪,因为这样using namespace std;
更容易,但我想我现在失败了我是一名“初学者”编码员,你们知道得更好。
所以我想我的问题是:为什么std::
而不是using namespace std;
?
谢谢。
前几天,当我问一个问题时,有人回答说如果有人问一个问题,请向他们展示正确的方法,而不是using namespace std;
我认为这有点奇怪,因为这样using namespace std;
更容易,但我想我现在失败了我是一名“初学者”编码员,你们知道得更好。
所以我想我的问题是:为什么std::
而不是using namespace std;
?
谢谢。
来自 C++ 常见问题解答:
我应该
using namespace std
在我的代码中使用吗?可能不是。
人们不喜欢
std::
一遍又一遍地打字,他们发现这using namespace std
会让编译器看到任何std
名字,即使是不合格的。美中不足的是,它让编译器可以看到任何std
名称,甚至是您没有想到的名称。换句话说,它会造成名称冲突和歧义。
https://isocpp.org/wiki/faq/coding-standards#using-namespace-std
简而言之,您不太可能错误地使用错误的类型或函数,或者名称冲突。假设您正在使用自己的数学库和 std,并以任意顺序使用它们两者进行声明。现在,它们都定义了函数 pow。当您调用 pow 时,您使用的是哪个 pow?我认为额外的打字是值得的。
我认为更有经验的程序员不会使用显式命名空间,参见例如Do you prefer explicit namespaces or 'using' in C++?
但是请注意,您永远不应该在头文件中导入命名空间,并且在某些情况下显式命名空间更清晰,例如使用函数std::min()
和std::max()
我认为这是一些偏好的事情。有些人喜欢在使用类时看到显式的命名空间。一个例外是我从不在头文件中使用 using namespace std。因为这可能会意外地改变使用此头文件的类的行为。
有经验的程序员使用任何能解决他们问题的方法,并避免任何产生新问题的方法。
因此,出于显而易见的原因,它们避免了头文件级别的使用指令。
他们试图避免在源文件中完全限定名称。次要的一点是,在没有充分理由的情况下编写更多代码并不优雅。重点是关闭 ADL。
这些好的理由是什么?有时您明确希望关闭 ADL。有时你想消除歧义。
所以以下是可以的:1)函数实现中的函数级使用指令和使用声明;2) 源文件中的源文件级使用声明;3)(有时)源文件级使用指令。
命名空间是我们变量的附加限定符。假设我们在中std
定义了“字符串”,现在如果我们在mynamespace
还定义了“字符串”。
现在,如果我写using namespace std;
在文件的顶部,那么从那里开始,一个字符串对于编译器来说就变得模棱两可了。
但是,可以采取一种中间方法,严格不using namespace std;
包含在 header(.h) 文件中,因为其他人可能想要使用您的类并且可能会发生冲突。而对于实现(.cxx)文件,如果您确定不会有任何冲突,则可以小心使用它。