📜  C++中的命名空间

📅  最后修改于: 2020-12-17 05:15:22             🧑  作者: Mango


考虑一种情况,当我们有两个人在同一个班上使用相同的名字Zara。每当我们绝对需要区分他们时,我们都必须使用一些其他信息以及他们的名字,例如该地区(如果他们居住在不同地区)或他们的母亲或父亲的名字等。

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

设计名称空间是为了克服这一困难,它被用作附加信息来区分具有不同库中可用的相同名称的相似函数,类,变量等。使用名称空间,可以定义定义名称的上下文。本质上,名称空间定义范围。

定义命名空间

命名空间定义以关键字命名空间开头,后跟命名空间名称,如下所示:

namespace namespace_name {
   // code declarations
}

要调用函数或变量的启用名称空间的版本,请在名称空间名称前添加(::),如下所示:

name::code;  // code could be variable or function.

让我们看看命名空间如何限制包括变量和函数在内的实体-

#include 
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 
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 
using std::cout;

int main () {
   cout << "std::endl is used with std!" << std::endl;
   
   return 0;
}

如果我们编译并运行以上代码,这将产生以下结果-

std::endl is used with std!

using指令中引入的名称遵循正常的作用域规则。从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,则它将使scope_name2的元素在范围内可用,如下所示:

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