C++ 中的命名空间


考虑这样一种情况,当我们在同一个班级中有两个同名 Zara 的人时。每当我们需要区分他们时,我们肯定必须使用一些附加信息以及他们的名字,例如区域,如果他们住在不同的区域或他们的母亲或父亲的名字等。

您的 C++ 应用程序中也可能出现相同的情况。例如,您可能正在编写一些具有名为 xyz() 的函数的代码,并且还有另一个可用的库也具有相同的函数 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 命名空间指令预先添加命名空间。该指令告诉编译器后续代码正在使用指定命名空间中的名称。因此,以下代码隐含了命名空间 -

#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指令中引入的名称遵循正常的作用域规则。从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