“使用命名空间”如何在C ++中工作
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了“使用命名空间”如何在C ++中工作相关的知识,希望对你有一定的参考价值。
我试图理解C ++中的命名空间。我读到有两种方法可以访问命名空间变量和函数。第一个是使用::
编写,第二个是使用顶部使用using
指令而不是一次又一次地编写它。我意识到第一种方法更好,因为第二种方法可能导致冲突。
但是,我想知道第二种方法是如何工作的。例如,如果我在顶部写using namespace std
,编译器如何知道它必须在开头添加std::
以及它没有的那些函数。如果我在main中编写了一个函数,首先它将检查我的主文件中的函数,然后它将检查函数声明中的头文件(我在主文件顶部声明)。现在,根据我的理解,std中的函数在名称空间内声明。所以,如果我不使用::
进行搜索,我就找不到它。
那么,std::
何时会在函数开头添加?
(这是简化的,但它是它的一般要点。)
当您编写std::bar
时,编译器不会查找名为“std :: bar”的内容,它会在“std”命名空间中查找名为“bar”的内容。
using namespace std;
使编译器在当前命名空间和std
中查找名称,因此它不需要在任何地方添加“std ::”以查找“std :: bar” - 它将通过查找“找到” bar“在std
内部以及当前名称空间中。
以下是对其工作原理的描述的链接: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也可以在查找函数声明的位置时应用。
此外,编译器可能需要执行重载解析,因为可能存在多个函数但具有不同数量的参数,并且这些重载可能存在于不同的命名空间中。
以上是关于“使用命名空间”如何在C ++中工作的主要内容,如果未能解决你的问题,请参考以下文章