可以“使用命名空间 std;”和“std::cout”一起使用?

问题描述 投票:0回答:3

同时使用

using namespace std;
std::cout
不会出现错误。这两个可以一起用吗

#include <iostream>
using namespace std;

int main() {
    
    std::cout << "Hello world!";

    return 0;
}
c++ std name-lookup using-directives
3个回答
6
投票

没问题。在这个声明中

std::cout << "Hello world!";

在命名空间

cout
中使用名称
std
的限定名称查找。

你也可以写

cout << "Hello world!";

在这种情况下,将使用非限定名称查找,并且由于指令

,将找到名称
cout

using namespace std;

您还可以包含 using 声明,例如

using std::cout;

注意避免使用using指令。这可能是歧义的原因。最好使用限定名称。


0
投票

namespace
的目的是防止碰撞。当您输入
using namespace std;
时,它会关闭该保护。这允许您使用
cout
string
vector
...而无需
std::
分辨率,但它们可能会与其他命名空间发生冲突。

在某些教程中,您可能会看到

using namespace std;
他们将其放在那里是为了使示例更短,而不必在每个地方都输入
std::
。但这种用法仅限于简短的示例。对于实际代码,建议不要添加
using namespace std;

您可以随时使用

std::cout
std::string
std::vector
等,无需担心碰撞。


0
投票

默认情况下,非限定名称(至少)在当前命名空间、全局命名空间 (

::
) 以及之间的所有内容中查找。这很好,因为当遇到
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
都解析为同一件事,您可以使用其中一个。

请注意,这个愉快的解决方案要求不会遇到冲突,而在更复杂的代码中决不能保证这一点。

© www.soinside.com 2019 - 2024. All rights reserved.