名称空间:
首先介绍几个概念:
1.声明区域(declaration region): 是可以在其中进行声明的区域. 例如:可以在函数外面声明全局变量, 其声明区域为其声明所在的文件; 对于在函数中声明的变量, 其声明区域为其声明所在的代码块.
2.潜在作用域(potential scope): 变量的潜在作用域从声明点开始, 到其声明区域的结尾. 因此潜在作用域比声明区域小, 这是由于变量必须定以后才能使用.
3.作用域: 变量对程序而言课件的范围被称为作用域.
作用域与潜在作用域的关系图:
C++还允许通过定义一种新的声明区域来创建命名的名称空间, 这样做的目的之一是提供一个声明名称的区域, 一个名称空间中的名称不会与另外一个名称空间的相同名称发生冲突, 同时允许程序的其他部分使用该名称空间中声明的东西. 例如:
namespace Jack{
// 声明变量
double pail;
// 函数原型
void fetch();
int pal;
// 结构体声明
struct Well{...};
}
namespace Jill{
// 函数定义
double bucket(double n)(...)
double fetch;
int pal;
// 结构体声明
struct Hill {...};
}
名称空间可以使全局的, 也可以位于另一个名称空间中, 但不能位于代码块中. 因此默认情况下, 在名称空间中声明的名称的链接性为外部的(除非它引用了常量).
除了用户定义的名称空间外, 还存在另一个名称空间--全局名称空间(global namespace). 它对应于文件级声明区域, 因此前面所说的全局变量现在被描述为位于全局名称空间中.
名称空间是开放的, 即可以把名称加入到已有的名称空间中, 例如: 下面这条语句就将函数原型goose添加到Jill中已有的名称列表中
namespace Jill{
char * goose(const char *);
}
同样, 原来的Jack名称空间为fetch()函数提供了原型, 可以在该文件后面(或另外一个文件中)再次使用Jack名称空间来提供该函数的代码:
namespace Jack{
void fetch()
{
...
}
}
当然, 需要有一种方法来访问给定名称空间中的名称, 最简单的方法使, 通过组用于解析运算符::, 使用名称空间来限定该名称:
// 使用Jack名称空间中的变量pail
Jack::pail = 12.34;
// 使用Jill名称空间中的结构体Hill
Jill::Hill mole;
// 使用Jack名称空间中的函数fetch
Jack::fetch();
未被修饰的名称(如 pail)称为未限定的名称(unqualified name), 包含名称空间的名称(如Jack::pail)称为限定的名称(qualified name)