考虑一个情况,当我们有两个同名的同名的Zara的同事。无论何时我们需要区分他们,我们将不得不使用一些额外的信息及其名称,如区域,如果他们住在不同的地区,或他们的母亲或父亲的名字等。
在C ++应用程序中也会出现相同的情况。例如,您可能正在编写一些具有名为xyz()的函数的代码,并且还有另一个可用的库,它也具有相同的函数xyz()。现在,编译器无法知道您在代码中指的是哪个版本的xyz()函数。
一个命名空间的目的是克服这个困难,并作为额外的信息来区分类似的功能,类,变量等在不同库中可用相同的名称。使用命名空间,可以定义名称定义的上下文。实质上,命名空间定义了一个范围。
定义命名空间:
命名空间的定义与关键字开头的命名空间,然后命名空间名称如下
namespacenamespace_name{// code declarations}
要调用启用了命名空间的版本的函数或变量,请按以下方式添加命名空间名称:
name::code; // code could be variable or function.
让我们看看命名空间范围包括变量和函数的实体:
#includeusingnamespacestd;// first name spacenamespacefirst_space{voidfunc(){cout<
如果我们编译并运行上面的代码,输出结果如下:
Inside first_space
Inside second_space
使用指令
您还可以使用using namespace伪指令避免前缀命名空间。该指令告诉编译器后续代码正在使用指定命名空间中的名称。因此,命名空间隐含在以下代码中:
#includeusingnamespacestd;// first name spacenamespacefirst_space{voidfunc(){cout<
如果我们编译并运行上面的代码,输出结果如下:
Inside first_space
using指令也可用于引用命名空间中的特定项目。例如,如果你打算使用的std命名空间的唯一部分是cout,你可以参考它如下:
using std::cout;
后续代码可以引用cout而不预先命名空间,但std命名空间中的其他项目仍然需要如下所示:
#includeusingstd::cout;intmain(){cout<
如果我们编译并运行上面的代码,输出结果如下:
std::endl is used with std!
在使用指令中引用的名称服从正常范围规则。该名称从using指令到可以找到该伪指令的范围的末尾是可见的。具有在外部范围中定义的相同名称的实体将被隐藏。
不连续的命名空间
命名空间可以在几个部分中定义,因此命名空间由其单独定义的部分的总和组成。命名空间的单独部分可以分散在多个文件中。
因此,如果命名空间的一部分需要在另一个文件中定义的名称,则该名称仍然必须声明。编写以下命名空间定义可以定义新的命名空间,也可以为现有命名空间添加新元素:
namespacenamespace_name{// code declarations}
嵌套命名空间
命名空间可以嵌套在其中,您可以在其他名称空间内定义一个命名空间,如下所示:
namespacenamespace_name1{// code declarationsnamespacenamespace_name2{// code declarations}}
您可以通过使用结果运算符访问嵌套命名空间的成员,如下所示:
// to access members of namespace_name2
using namespace namespace_name1::namespace_name2;
// to access members of namespace:name1
using namespace namespace_name1;
在上述语句中,如果您使用namespace_name1,那么它将使命名空间名称2的元素在范围内可用,如下所示:
#includeusingnamespacestd;// first name spacenamespacefirst_space{voidfunc(){cout<
如果我们编译并运行上面的代码,输出结果如下:
Inside second_space