'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" 可以找到它。
我正在尝试了解 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" 可以找到它。