-4

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

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

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

4

2 回答 2

1

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

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

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

于 2018-02-28T10:00:23.473 回答
0

这是一个描述其工作原理的链接: 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在查找函数声明的位置时也可以应用。

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

于 2018-02-28T09:35:42.260 回答