随着项目的增大,名称相互冲突的可能性也将增加。使用多个厂商的类库时,可能导致名称冲突。例如,两个库可能都定义了名为List、Tree和Node的类,但定义的方式不兼容。用户可能希望使用一个库的List类,而使用另一个库的Tree类。这种冲突被称为名称空间问题。
1、使用关键字namespace创建命名空间
namespace Jack {
double pail;
void fetch();
}
namespace Jill {
double fetch;
int pal;
}
任何名称空间中的名称都不会与其他名称空间中的名称发生冲突。因此,Jack中的fetch可以与Jill中的fetch共存。
名称空间是开放的(open),即可以把名称加入到已有的名称空间中。
namespace Jill {
char *goose(const char *);
}
这条语句将名称goose添加到Jill中已有的名称列表中。
2、访问给定名称空间中的名称,使用作用域解析运算符::。
Jack::pail = 1.1;
Jill::pal = 1;
3、我们并不希望每次使用名称时都对它进行限定。
例如std::cin
如果想直接使用cin需要使用using声明
#include <iostream>
using std::cin;
4、using声明使一个名称可用,而using编译指令使所有的名称都可用。using编译指令由名称空间名和它前面的关键字using namespace组成,它使名称空间中的所有名称都可用,而不需要使用作用域解析运算符。
using namespace std;
5、using声明与using编译指令比较
一般说来,使用using声明比使用using编译指令更安全,这是由于它只导入指定的名称。如果该名称与局部名称发生冲突,编译器将发出指示。using编译指令导入所有名称,包括可能并不需要的名称。如果与局部名称发生冲突,则局部名称将覆盖名称空间版本,而编译器并不会发出警告。另外,名称空间的开放性意味着名称空间的名称可能分散在多个地方,这使得难以准确知道添加了哪些名称。
6、命名空间可以嵌套
namespace elements {
namespace fire {
int flame;
}
float water;
}
使用flame格式为
elements::fire::flame = 1。
或者
using namespace elements::fire;
flame = 1;
7、可以对命名空间起别名
namespace my = elements::fire;
my::flame = 10;
8、未命名的命名空间
namespace {
int flame;
}
由于这种名称空间没有名称,因此不能显式地使用using编译指令或using声明来使它在其他位置都可用。具体地说,不能在未命名名称空间所属文件之外的其他文件中,使用该名称空间中的名称。
9、头文件中不应该含using声明
10、对于using声明,首选将其作用域设置为局部而不是全局