考虑这样一种情况,当我们使用相同的名称,叫Zara的两个人在同一个班级。我们需要明确区分它们将不得不使用一些额外的信息,如他们的名字,如他们生活在不同的区域或母亲或父亲的名字等等。
同样的情况也出现在C++应用程序中。例如,可能会有一些代码,有一个函数调用xyz()函数,而且这也有同样的功能另一个某某库也有提供。现在,编译器没有办法知道xyz()函数指的是代码中的哪一个版本。
命名空间被设计为克服这一困难,并作为附加信息来区分类似函数,类,变量等具有相同名称的不同的库可用。使用命名空间可以定义在名称定义的上下文。在本质上,一个命名空间中定义了一个范围。
定义命名空间:
命名空间的定义使用命名空间关键字后面的命名空间名称如下开始:
namespace namespace_name { // code declarations }
调用任何函数或变量的命名空间启用版本,前面加上命名空间名称如下:
name::code; // code could be variable or function.
让我们来看看如何命名空间范围的实体,包括变量和函数:
#include <iostream> using namespace std; // first name space namespace first_space{ void func(){ cout << "Inside first_space" << endl; } } // second name space namespace second_space{ void func(){ cout << "Inside second_space" << endl; } } int main () { // Calls function from first name space. first_space::func(); // Calls function from second name space. second_space::func(); return 0; }
如果我们编译并运行上面的代码,这会产生以下结果:
Inside first_space Inside second_space
using指令:
也可避免命名空间使用using namespace指令前缀。这个指令告诉后续代码利用名指定的命名空间中的编译器。因此,命名空间隐含了下面的代码:
#include <iostream> using namespace std; // first name space namespace first_space{ void func(){ cout << "Inside first_space" << endl; } } // second name space namespace second_space{ void func(){ cout << "Inside second_space" << endl; } } using namespace first_space; int main () { // This calls function from first name space. func(); return 0; }
如果我们编译并运行上面的代码,这会产生以下结果:
Inside first_space
using指令也可以被用来指特定的项目名称空间内。例如,如果打算使用std命名空间,唯一部分是cout,如下所示:
using std::cout;
随后的代码可以参考cout没有预先考虑命名空间,但在std命名空间的其他项目仍然需要按如下方式:
#include <iostream> using std::cout; int main () { cout << "std::endl is used with std!" << std::endl; return 0; }
如果我们编译并运行上面的代码,这会产生以下结果:
std::endl is used with std!
使用指令引入的名称遵循正常的范围规则。这个名字是从using指令在该指令中范围的结束点内可见。实体与外部范围定义的同名是隐藏的。
不连续的命名空间:
命名空间可以在几个部分来定义,因此命名空间是由它单独定义的部分的总和。一个命名空间的分开的部件可以分散在多个文件中。
所以,如果命名空间中的一个组成部分,需要在另一文件中定义的名称,名称仍然必须声明。编写以下命名空间的定义或者定义了一个新的命名空间或增加了新的元素,以现有的:
namespace namespace_name { // code declarations }
嵌套的命名空间:
命名空间可以嵌套,可以定义一个命名空间在另一个名字空间中,如下所示:
namespace namespace_name1 { // code declarations namespace namespace_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,那么它有如下namespace_name2的元素范围可供选择:
#include <iostream> using namespace std; // first name space namespace first_space{ void func(){ cout << "Inside first_space" << endl; } // second name space namespace second_space{ void func(){ cout << "Inside second_space" << endl; } } } using namespace first_space::second_space; int main () { // This calls function from second name space. func(); return 0; }
如果我们编译并运行上面的代码,这会产生以下结果:
Inside second_space