c++语言基础命名空间

  

<强> c++的命名空间的使用

  

c++语言引入命名空间(名称空间)这一概念主要是为了避免命名冲突,其关键字为名称空间。

  

科技发展到如今,一个系统通常都不会仅由一个人来开发完成,不同的人开发同一个系统,不可避免地会出现变量或函数的命名冲突,当所有人的代码测试通过,没有问题时,将所有人的代码结合到一起,因为变量或函数重名而导致的问题将会造成一定的混乱,例如:

  
  

int标志=1;//小李声明的变量
//?/中间间隔若干行代码
  bool国旗=true;//小韩声明的变量
  

     

注意:此例仅为解释命名空间所用,在公司的系统开发中并非如此中所述,完全仅靠命名空间来解决命名冲突的,具体编程规范可以参考林锐的《高质量程序设计指南》一书。

  

如上所示,因为个人习惯不同,小李喜欢声明int型变量用于逻辑判断,而小韩则更喜欢采用bool类型变量。但两个声明放到同一个函数中的时候,很明显编译器会提示出国旗变量重新定义的错误。这种问题若不加以处理是无法编译通过的。

  

可以使用命名空间解决类似上面的命名冲突问题,例如:

  
  

名称空间李{//小李的变量声明
  int标志=1;
  }
  名称空间汉{//小韩的变量声明
  bool国旗=true;
  }

     

小李与小韩各自定义了以自己姓氏为名的命名空间,此时将小李与小韩的国旗变量定义再置于同一个函数体中,则不会有任何问题,当然在使用这两个变量的时候需要指明所采用的是哪一个命名空间中变的标志量。

  

指定所使用的变量时需要用到“::”操作,符“::”操作符是域解析操作符。例如:

  
  

李::国旗=0;//使用小李定义的变量国旗
  汉:国旗=false;//使用小韩定义的变量国旗
  

     

我们已经定义了两个命名空间李和汉,并在其中各自声明旗变量,使用的时候则需要分别用域解析操作符指明此时用的国旗变量是谁定义出来的国旗变量,是小韩还是小李定义的。

  

除了直接使用域解析操作符,还可以采用使用声明(使用声明),例如:

  
  使用李:

:国旗;
  国旗=0;//使用小李定义的变量国旗
  汉:国旗=false;//使用小韩定义的变量国旗
  

     

在代码的开头用使用声明了李::国旗,其含义是使用声明以后的程序中如果出现未指明的国旗时,则使用李::国旗,但是若要使用小韩定义的国旗,则仍需要汉::国旗。

  

使用声明不仅仅可以针对命名空间中的一个变量,也可以用于声明整个命名空间,例如:

  
  李

使用名称空间;
  国旗=0;//使用小李定义的变量国旗
  汉:国旗=false;//使用小韩定义的变量国旗
  

     

如果命名空间李中还定义了其他的变量,则同样具有国旗变量的效果,在使用声明后,若出现未具体指定命名空间的命名冲突变量,则默认采用李命名空间中的变量。
  命名空间内部不仅可以声明或定义变量,对于其它能在命名空间以外声明或定义的实体,同样也都能在命名空间内部进行声明或定义,例如变量的声明或定义,函数的声明或定义,typedef等都可以出现在命名空间中。

  

下面我们来看一个简单的c++程序的示例:

        # include   使用名称空间性病;   int main () {   cout<& lt;“hello world !”& lt; & lt; endl;   返回0;   }      

这是一个简单的c++程序hello world示例,在程序中采用了用声明命名空间性病,使用名称空间性病;这一语句涵盖了性病命名空间中的所有标识符,而该命名空间包含c++所有标准库。头文件iostream文件中定义的所有变量,函数等都位于std命名空间中,每次使用iostream中的变量或函数都需要在前面加上std::是非常麻烦的一件事,为此可直接用使用声明将性病中的所有变量或函数等都声明出来。

  

如果不使用名称空间性病;用这一语句,则程序应该像下面这样:

        # include   int main () {   std:: cout<& lt;“hello world !”& lt; & lt; std:: endl;   返回0;   }      

这样看起来是相当麻烦的,如果在某次使用iostream中变量或函数时漏掉性病则会导致为定义标识符错误。

c++语言基础命名空间