同时使用
using namespace std;
和std::cout
不会出现错误。这两个可以一起用吗
#include <iostream>
using namespace std;
int main() {
std::cout << "Hello world!";
return 0;
}
没问题。在这个声明中
std::cout << "Hello world!";
在命名空间
cout
中使用名称std
的限定名称查找。
你也可以写
cout << "Hello world!";
在这种情况下,将使用非限定名称查找,并且由于指令
,将找到名称
cout
using namespace std;
您还可以包含 using 声明,例如
using std::cout;
注意避免使用using指令。这可能是歧义的原因。最好使用限定名称。
namespace
的目的是防止碰撞。当您输入 using namespace std;
时,它会关闭该保护。这允许您使用 cout
、string
、vector
...而无需 std::
分辨率,但它们可能会与其他命名空间发生冲突。
在某些教程中,您可能会看到
using namespace std;
他们将其放在那里是为了使示例更短,而不必在每个地方都输入 std::
。但这种用法仅限于简短的示例。对于实际代码,建议不要添加 using namespace std;
您可以随时使用
std::cout
、std::string
、std::vector
等,无需担心碰撞。
默认情况下,非限定名称(至少)在当前命名空间、全局命名空间 (
::
) 以及之间的所有内容中查找。这很好,因为当遇到 using namespace std;
时,std
这个名字是不合格的。因此,该名称受此查找的约束,该查找将名称解析为 ::std
(标准命名空间的完全限定名称)。
遇到
using namespace std;
后,非限定名称查找 also 会查找 ::std
命名空间。对于本问题代码的简单情况,其中全局命名空间是当前命名空间,这意味着在全局命名空间和标准命名空间中都会查找非限定名称 X
,分别为 ::X
和 ::std::X
。 (此外,这两个选择具有相同的优先级;如果两者都找到,您会得到 “using namespace std;”的问题。幸运的是,在这个简单的代码中,我们不会遇到这个问题。)
对于
cout
(前面没有 ::
),查找会同时尝试 ::cout
和 ::std::cout
。前者在这段代码中不存在,而后者是已知的。所以这个名字解析为 ::std::cout
。
对于
std::cout
,查找会尝试 ::std::cout
和 ::std::std::cout
。前者是已知的,而后者不存在。所以这个名字也解析为::std::cout
。
因此,
cout
和std::cout
都解析为同一件事,您可以使用其中一个。
请注意,这个愉快的解决方案要求不会遇到冲突,而在更复杂的代码中决不能保证这一点。