简介
命名空间是ANSIC++引入的可以由用户命名的作用域,用来处理程序中常见的同名冲突。一个良好的程序应该将程序中的所有实体(变量,类,函数)都放到某个命名空间里。
过去我们用的全局变量可以理解为全局命名空间,独立于所有有名的命名空间之外,它是不需要用namespace声明的,实际上是由系统隐式声明的,存在于每个程序之中。
命名空间的使用
- using指令之声明整个命名空间
using namespace *; // 这里的*可以表示任何命名空间
using namespace *;会给我们书写程序带来方便,但也要慎用,如果释放了多个命名空间中的东西后,它们又可能会引起命名冲突。
- using指令之声明命名空间中特定的项目
using std::cout;
随后的代码中,在使用cout时就可以不用加上命名空间名称作为前缀。
- 不连续的命名空间
命名空间可以定义在几个不同的部分中,因此命名空间是由几个单独定义的部分组成的。一个命名空间的各个组成部分可以分散在多个文件中。
所以,如果命名空间中的某个组成部分需要请求定义在另一个文件中的名称,则仍然需要声明该名称。下面的命名空间定义可以是定义一个新的命名空间,也可以是为已有的命名空间增加新的元素:
namespace namespace_name
{
//代码声明
}
- 嵌套的命名空间
命名空间可以嵌套,可以在一个命名空间中定义另一个命名空间,如下所示:
namespace namespace_name1
{
//代码声明
namespace namespace_name2
{
//代码声明
}
}
//可以使用::运算符来访问嵌套的命名空间中的成员:
//访问namespace_name2中的成员
using namespace namespace_name1::namespace_name2;
- 多重界面
有时候我们同一个命名空间在面向不同的用户时,可能需要提供不同的界面。比如我们有一个命名空间里面定义了关于串口的一些实体。我们给一个开发中的程序提供的接口可能包括:打开串口,设置波特率,设置校验位等。但是面向一个最终用户时,我们可能只需要给他提供一个打开串口接口就够了。这便是使用多重界面的意义。
1、实现多重界面的方法有很多,首先可能想到的是使用不同的命名空间。
namespace A
{
voidFun1();
voidFun2();
voidFun3();
}
namespaceA_Interface1
{
usingA::Fun1;
}
2、上面界面实现的过程中,A_Interface1和A有着非常强的关联,修改A中的Fun1会使A_Interface1中的Fun1也修改。
有时候我们可能不需要这么强的关联性,让A_Interface1中的函数有着一定的可控性,可以使用下面界面实现的方式。
namespaceA
{
voidFun1();
voidFun2();
voidFun3();
}
namespaceA_Interface1
{
voidFun1()
{
A::Fun1();
}
}
- 无名命名空间
我们知道不同命名空间的变量名可以重复,这有助于第三方将两个不同人写的代码进行整合。有时候我们并不想我们的某些代码被其他人进行整合,但是也想利用命名空间的优势——可以让变量名重复。这时候使用无名命名空间就很有价值了:第一没有名字,其他地方无法引用进去;第二因为是命名空间它里面的变量可以和其他命名空间中变量的名字重复。需要注意的是,不同编译单元中的无名命名空间不同。 - 命名空间的别名
我们在给命名空间取名字的时候,如果太短(比如上面的A)很可能出现冲突。名太长又太麻烦。这时候我们将长名字的命名空间在合适的地方取个别名可能会更好些。格式如下:
namespace A = LongNameNamespaceA;