命名空间 namespace
C++中有两个比较基础又重要的概念,一个是作用域,另一个是生存期。作用域顾名思义就是作用的区域,分为函数原型作用域、局部作用域、类作用域和命名空间作用域,它们的作用范围按此顺序变大。生存期顾名思义就是变量从创建到消亡的这段时间,分为静态生存期和动态生存期。如果变量的生存期与系统程序的运行期相同,则该变量就具有静态的生存期。在所有大括号对之外定义的变量具有静态生存期,命名空间作用域都在大括号外,所以其变量具有静态生存期。在局部作用域中用static声明的变量也具有静态生存期。除了这两种情况之外的变量都具有动态生存期。
命名空间建立了一些相互隔离的作用域,且这些作用域里的变量都具有静态生存期。
namespace产生的原因
C++中采用的是单一的全局变量命名空间。在这单一的空间中,如果有两个变量或函数的名字完全相同,就会出现冲突。命名空间就是ANSIC++引入的可以由用户命名的作用域,用来处理程序中常见的同名冲突。
如果在头文件head1.h定义了全局变量string user_name;然后再在头文件head2.h也定义了string user_name,或者调用的某个库中已经定义了这个全局变量,系统在编译的时候就会报重复定义的错误。这个时候可以用extem string user_name来解决编译问题,但这个时候string user_name的作用域就从head1.h扩展到了head2.h,也许这并不是我们想要的情况,我们或许想要得到的是两个不同的全局变量,只是名字一样而已。
namespace使用
使用时先把变量定义在两个不同的命名空间中。
namespace XXX
{
string user_name;
}
namespace YYY
{
string user_name;
}
然后通过命名空间限定读取:
XXX::user_name="asd";
YYY::user_name="qwe";
一个命名空间中可以包括:变量(可以带有初始化);常量;数(可以是定义或声明);结构体;类;模板和命名空间(在一个命名空间中又定义一个命名空间,即嵌套的命名空间)。但命名空间中不可以包含命令行,如#include,不然会报错。
使用时可以包含整个命名空间using namespace XXX; 也可以只包含其中的某个变量using XXX::user_name; 这样可以减少编译的大小。