'using namespace' 在 C++ 中的工作原理

How 'using namespace' works in C++

我正在尝试了解 C++ 中的命名空间。我读到有两种访问命名空间变量和函数的方法。第一个是使用 :: 编写,第二个是在顶部使用 using 指令而不是一次又一次地编写它。我意识到第一种方法更好,因为第二种方法可能会导致冲突。

但是,我想知道第二种方法的实际效果如何。例如,如果我在顶部写 using namespace std ,编译器如何知道它必须在开头添加 std:: 的功能以及它不需要的功能。如果我在 main 中编写了一个函数,首先它会在我的主文件中检查该函数,然后它会在头文件(我在主文件顶部声明的)中检查函数声明。现在,根据我的理解,std 中的函数是在名称空间内声明的。所以,如果我不使用 ::.

搜索,我将找不到它

那么,什么时候 std:: 会在函数的开头添加?

这里有一个 link 对其工作原理的描述:http://en.cppreference.com/w/cpp/language/unqualified_lookup。 更全面的概述从这里开始 (http://en.cppreference.com/w/cpp/language/lookup) 并向您展示了使用限定名称与非限定名称的所有情况。

请注意,C++ 中的名称解析实际上非常复杂。参数相关查找 (ADL) http://en.cppreference.com/w/cpp/language/adl 也可以在查找函数声明的位置时应用。

此外,编译器可能需要进行重载解析,因为可以有多个函数但参数数量不同,并且这些重载可能存在于不同的命名空间中。

(这是简化的,但它是它的一般要点。)

当您编写 std::bar 时,编译器不会查找名为 "std::bar" 的内容,它会在 "std" 命名空间中查找名为 "bar" 的内容。

using namespace std; 使编译器在当前命名空间和 std 中查找名称,因此它不需要在任何地方添加 "std::" 来查找 "std::bar" - 通过在 std 和当前命名空间中查找 "bar" 可以找到它。