命名空间 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; 这样可以减少编译的大小。

posted @ 2017-09-03 22:49  三界小生  阅读(166)  评论(0)    收藏  举报