一、背景
使用多个厂商的类库时,可能导致名称冲突。
二、一些术语
声明区域:可以在其中进行声明的区域。函数外定义的,声明区域为所在文件;函数内定义的,声明区域为所在的代码块。
潜在作用域:从声明点开始,到其声明区域的结尾。
作用域:变量对程序而言可见的范围。(在潜在作用域,变量有时不可见,如局部变量隐藏全局变量)
声明区域>潜在作用域>作用域
三、名称空间
1.名称空间的创建
创建一个名为Jill的名称空间
namespace Jill{
int pal;
double fetch;
double bucket();
struct Hill{...};
}
名称空间是开放的
(1)可以把名称加入到已有的名称空间中
namespace Jill{
char goose(const char*);
}
(2)可以在之后提供函数代码
namespace Jill{
double bucket()
{
...
}
}
2.名称空间的位置
(1)全局
(2)另一个名称空间中(嵌套式名称空间)
namespace elements
{
namespace fire
{
int flame;
...
}
float water;
}
注:名称空间不能位于代码块中!
3.using声明和using编译指令
区别
(1)
using声明 使特定的标识符可用,如using Jill::fetch
using编译指令 使整个名称空间可用,如using namespace Jill
(2)当函数中已有某名称时
using声明 不能导入相同名称
using编译指令 可导入,且局部名称将隐藏名称空间名
注:如果函数被重载,将导入所有的版本
使用
(1)函数中使用:使名称在函数中可用
namespace Jill{
double fetch;
}
int main()
{
using Jill::fetch;
cin>>fetch; //read a value into Jill::fetch
}
(2)函数外使用:使名称在全局中可用
using Jill::fetch;
int main()
{
cin>>fetch;
other();
}
void other()
{
cout<<fetch;
}
4.访问名称空间中的名称
用作用域解析运算符 ::
Jill::pal=12;
Jill::bucket();
假如同时有名称空间变量、全局变量、局部变量
namespace Jill{
double fetch;
}
char fetch;
int main()
{
using namespace Jill;
double fetch;
cin>>fetch;//访问局部变量
cin>>::fetch;//访问全局变量
cin>>Jill::fetch;//访问名称空间中变量
...
}
5.嵌套式名称空间
以2中为例:
namespace elements
{
namespace fire
{
int flame;
...
}
float water;
}
(1)可在名称空间中使用using
namespace myth
{
using Jill::fetch;
using namespace elements;
using std::cout;
using std::cin;
}
(2)访问名称
由于fetch位于Jill中,而Jill:fetch又位于myth中,所以可以这样访问
std::cin>>myth::fetch;
std::cout>>Jill::fetch;
(3)using编译指令可传递
即 using namespace myth; 这条编译指令等价于以下两条编译指令:
using namespace myth;
using namespace elements;
6.给名称空间创建别名
namespace my_favorite_things{...}
namespace mft=my_favorite_things;
7.未命名的名称空间
namespace
{
int ice;
}
潜在作用域:从声明点到该声明区域末尾
缺点:由于没有名称,所以不能显式地使用using编译指令或using声明来使它在其他位置都可用
作用:可作为链接性为内部的静态变量的替代品,如以下代码:
static int counts;
采用名称空间的方法如下:
namespace
{
int counts;
}