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