C++ Namespaces
考虑一种情况,当我们在同一个class中有两个同名的人Zara时。 每当我们需要区分它们时,我们必须使用一些额外的信息以及它们的名称,如区域,如果它们居住在不同的区域或他们的母亲或父亲的名字等。
您的C ++应用程序中可能出现相同的情况。 例如,您可能正在编写一些具有名为xyz()的函数的代码,并且还有另一个库,它也具有相同的函数xyz()。 现在,编译器无法知道您在代码中引用的xyz()函数的版本。
namespace旨在克服这一困难,并用作额外信息,以区分不同库中可用的相同名称的类似函数,类,变量等。 使用命名空间,您可以定义定义名称的上下文。 实质上,命名空间定义了范围。
定义命名空间
命名空间定义以关键字namespace空间开头,后跟命名空间名称,如下所示 -
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指令避免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指令中引入的名称遵循正常范围规则。 从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