一、命名空间
1.1、什么是命名空间?
命名空间(namespace)是C++语言特别重要的特性,当第三方供应商提供的库时,为了避免与其他供应商或者用户定义的名字相冲突(命名空间污染),常常将库的内容放置在自己独立的命名空间中。C++标准库也定义了相应命名空间std,用户在使用标准库时必须通过作用域运算符(::),或者使用using关键词来简化命名空间中名字的使用。
1.2、命名空间的实现与使用?
1.2.1、命名空间的用法
- 支持多个同名namespace分布在不同文件中,编译时合并。
- 支持namespace的嵌套
1.2.2、代码实现
::是运算符中等级最高的,它分为三种:全局作用域符,类作用域符,命名空间作用域符。
下面的代码来源于《c++ premier》:
namespace blip{
int i=16,j=15,k=23;
//其他声明
}
int j =0; //正确:blip的j隐藏在命名空间中
void manip()
{
//using指示,bilp中的名字被“添加”到全局作用域中
using namespace bilp; //如果使用了j,则将在::j和bilp::j之间产生冲突
++i; //将bilp::i设定为17
++j; //二义性错误:是全局的j还是bilp::j?
++::j; //正确:将全局的j设定为1
++bilp::j; //正确:将blip::j设定为16
int k = 97; //正确:当前局部的k隐藏了bilp::k
++k; //正确:将当前局部的k设定为98
}
using指示将命名空间bilp中定义的名字仿佛提升到blip的上层空间,而不是manip的局部作用域。这带来问题便是,如果在上层空间中也定义了相同名字的变量,那么对该变量的直接使用会出现错误。这种错误在不使用该变量时完全不报错,也就是说提升的变量与原来的变量名字即使相同,只要不对其直接访问编译便可以正常通过。这带来的结果是,对于某些库有时用到其新特性时才会出现问题,无疑增加了维护的难度。所以在可以的情况下,尽量避免using指示。