C ++中的命名空间

考虑一种情况,当我们在同一个班级中有两个同名的人Zara时.每当我们需要区分它们时,我们必须使用一些额外的信息以及它们的名称,如区域,如果它们居住在不同的区域或他们的母亲或父亲的名字等等.

您的C ++应用程序中可能出现相同的情况.例如,您可能正在编写一些具有名为xyz()的函数的代码,并且还有另一个可用的函数库,它也具有相同的函数xyz().现在,编译器无法知道您在代码中引用的xyz()函数的版本.

命名空间旨在克服这一困难,用作区分类似函数,类,变量等的附加信息,使用不同库中可用的相同名称.使用命名空间,您可以定义定义名称的上下文.本质上,命名空间定义范围.

定义命名空间

命名空间定义以关键字命名空间开头通过命名空间名称如下 :

namespace namespace_name {
   // code declarations
}

要调用函数或变量的启用命名空间的版本,请在(&:)命名空间名称前加上 :

 
 name :: code;//代码可以是变量或函数.

让我们看看命名空间范围如何实体包括变量和函数 :

#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!

使用指令中引入的名称遵守正常范围规则.从使用指令到找到指令的作用域的末尾,可以看到该名称.隐藏在外部作用域中定义的具有相同名称的实体.

不连续的命名空间

命名空间可以在几个部分中定义,因此命名空间是由其单独定义的部分的总和组成.命名空间的各个部分可以分布在多个文件中.

因此,如果命名空间的一部分需要在另一个文件中定义名称,则仍必须声明该名称.编写以下命名空间定义要么定义新的命名空间,要么将新元素添加到现有的命名空间;

 
 namespace namespace_name {
//代码声明
}

嵌套命名空间

命名空间可以嵌套在可以在另一个命名空间内定义一个命名空间的地方名称空间如下 :

 
 namespace namespace_name1 {
//代码声明
 namespace namespace_name2 {
//code声明
} 
}

您可以使用分辨率运算符访问嵌套命名空间的成员,如下所示;

// 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