名称空间(namespace)
- 声明区域(declaration region)
声明区域是可以在其中进行声明的区域。例如,可以在函数外面声明全局变量,对于这种变量,其声明区域为其声明所在的文件。对于在函数中声明的变量,其声明区域为其声明所在的代码块。 - 潜在作用域(potential scope)
变量的潜在作用域从声明点开始,到其声明区域的结尾。因此潜在作用域比声明区域小,这是由于变量必须定义后才能使用。
+ 名称空间特性
namespace Jack {
double pail;
void fetch();
int pal;
}
namespace Jill {
double bucket(double n) {...}
double fetch;
int pail;
}
namespace Jack {
int b;
}
namespace A {
namespace B {
int a;
int b;
}
}
int main()
{
Jack::Pail = 12.34;
}
- using声明与using编译指令
C++提供了using声明和using编译指令简化对名称空间中名称的使用,using声明使特定的标示符可用,using编译使整个名称空间可用
using Jack::pail;
int main()
{
double pail;
using Jack::pail;
using namespace Jack;
pail = 3;
cout << Jack::pail << endl;
return 0;
}
namespace elements {
namespace fire {
};
}
namespace myth {
using Jack::pail;
using namespace elements;
}
namespace MEF = myth::elements::fire;
static int counts;
int other();
int func(){ ... }
int other(){ ... }
namespace {
int counts;
}
int func();
int other();
int main()
{
cin >> myth::fetch;
using namespace myth;
cin >> fetch;
using MEF::flame;
return 0;
}
- 名称空间指导原则
- 使用在已命名的名称空间中声明的变量,而不是使用外部全局变量
- 使用在未命名的名称空间中声明的变量,而不是静态全局变量
- 如果开发一个函数库或类库,将其放在一个名称空间中。C++提倡将标准函数库放在名称空间std中,扩展来自C语言的函数。但并非所有的编译器都完成了这种过度
- 仅将编译指令using作为一种将旧代码转换为使用名称空间的权宜之计
- 不要在头文件中使用using编译指令。首先,这样做掩盖了要让那些名称可用;另外包含头文件的顺序可能影响程序的行为。如果非要使用using编译指令using,应该将其放在#include之后
- 导入名称时,首选使用作用域解析运算符或using声明的方法
- 对于using声明,首选将其作用域设置为局部而不是全局。