“使用命名空间”如何在C ++中工作

问题描述 投票:-4回答:2

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

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

那么,std::何时会在函数开头添加?

c++ namespaces name-resolution
2个回答
0
投票

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

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

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


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也可以在查找函数声明的位置时应用。

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

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