名称空间的一些指导原则:
- 使用在已命名的名称空间中声明的变量,而不是使用外部全局变量。
- 使用在已命名的名称空间中声明的变量,而不是使用静态全局变量。
- 如果开发了一个函数库或类库,将其放在一个名称空间中。事实上,C++ 当前提倡将标准函数库放在名称空间 std 中,这种做法扩展到了来自C语言中的函数。例如,头文件 math.h 是与 C 语言兼容的,没有使用名称空间,但 C++ 头文件 cmath 应将各种数学库函数放在名称空间std中。
- 仅将编译指令 using 作为一种将陈旧代码转换为使用名称空间的权宜之计。
- 不要在头文件中使用 using 编译指令。首先,这样做掩盖了要让哪些名称可用;另外,包含头文件的顺序可能影响程序的行为。如果非要使用 using 编译指令,应将其放在所有预处理器编译指令 #include 之后。
- 导入名称时,首选使用作用域解析操作符或 using 声明的方法。
- 对于using声明,首先将其作用域设置为局部而不是全局。
未命名的名称空间:
namespace
{
int zdsCool;
int zdsHot;
}
这就像后面跟着 using 编译指令一样,也就是说,在该名称空间中声明的名称的潜在作用域为:从声明开始点到声明区域末尾。从这方面看,它们与全局变量相似。不过,由于这种名称空间没有名称,因此不能显示的使用 using 编译指令或 using 声明来使它在其它位置都可用。具体地说,不能在未命名名称空间所属文件之外的其他文件中,使用该名称空间中的名称,因此该方法可替代链接性为内部的静态变量。实际上,C++ 标准不赞成在名称空间和全局作用域中使用关键字 static(该标准使用“不赞成”表明,这种做法,目前合法,但以后很可能将其视为非法)。例如,下面代码:
static int nCount;
int fun1();
int main()
{
…
}
int fun1()
{
…
}
C++ 标准的意思是,程序员应该这样做:
namespace
{
int nCount;
}
int fun1();
int main()
{
…
}
int fun1()
{
…
}