这是一篇译文原文地址
有时你的代码中可能会有一个叫做xyz()
的函数,而另一个库中也有一个相同的xyz()函数。此时编译器无法确定你使用的是哪一个版本的xyz()
命名空间用来克服这个困难并且它作为额外信息来区分不同库中的相同名字,比如相同的函数名,类名,变量等。使用命名空间你可以定义参数在哪个命名中被定义。本质上一个命名空间定义了一个范围。
- 定义一个命名空间
命名空间以namespace
开始,后面紧跟着命名空间的名字,如下所示
namespace namespace_name{
// code declarations
}
- 调用命名空间中使能的函数或者变量,如下所示应该先考虑命名空间的名字
#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();
// Calls variable from first name space.
cout << first_space::space << endl;
// Calls variable from second name space.
cout << second_space::space << endl;
return 0;
}
- 使用指令
你也可以通过直接使用using namespace
来避免每次调用都要加上命名空间。这个指令告诉编译器随后的代码使用指定命名空间中的命名,此时如下所示
// first name space
namespace first_space{
int space = 1;
void func(){
cout << "Inside first_space" << endl;
}
}
// second name space
namespace second_space{
int space = 2;
void func(){
cout << "Inside second_space" << endl;
}
}
using namespace first_space;
int main () {
// Calls function from specified name space.
func();
return 0;
}
使用指令也可以用来指定命名空间中特殊的项,例如std namespace
中你只想使用cout
你可以这样指定它:using std::cout
随后的代码不用再加上命名空间就可以指定cout
,但是std中的其它项还是需要明显的加上std命名空间
#include <iostream>
using std::cout;
int main () {
cout << "std::endl is used with std!" << std::endl;
return 0;
}
- 不连续的命名空间定义
一个命名空间可以被定义在不同的地方,因此一个命名空间是分开定义地方的总和,分开的部分可以在不同的文件中。
如果命名空间的一部分需要使用在另一个文件定义的一个名字,这个名字也需要被声明,写一个下面的命名空间,要么定义一个新的命名空间要么在已有中增加元素
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;
}