第一章 01 namespace 命名空间

时间:2023-03-09 07:40:36
第一章 01  namespace 命名空间

一、什么是namespace?

namesapce是为了防止名字冲突提供的一种控制方式。

当一个程序需要用到很多的库文件的时候,名字冲突有时无法避免。之前的解决思路是使用更长的变量名字,使用不方便。

二、命名空间的定义

1、namespace   空间名称 {

变量;

函数;

类;

}

三、命名空间的特点

1、每个命名空间都有自己的作用域;

2、命名空间可以是不连续的,正像代码中的所列举的例子;

1.1 如何理解命名空间的作用域

 namespace global_namespace{

              namespace local_namespace_1{

               int i;
int j;
} namespace local_namespace_2{ int i;
int j;
} }

LINE6~7和LINE13~14均定义相同的变量,但是不会冲突;

因为引用的时候分别为

global_namespace::local_namespace_1::i=10;
global_namespace::local_namespace_2::i=10; 

在使用的时候,需要明确的指出变量所在的空间,因为不会冲突啦!不过这种写法,看着就有崩溃的赶脚。

幸好,在同一个命名空间内的应用是不需要这样啰嗦的

 namespace    local_namesapce_3{
int i=;
int j=; int sum = i+j; //这里是不需要写出变量所在的命名空间的 }

1.2  命名空间可以是不连续的,改如何理解呢?

当我们定义了一个命名空间的时候,可能有两种情况:

1)之前从来没有定义过,这里是第一次定义命名空间;

2)之前已经定义过,这里则意味着为原来的命名空间增加一些新的成员

这里以第二种情况举例:

在aa.hh头文件中定义了命名空间

namespace  namespace_test{

int i;
int j; }

接着我们在bb.hh头文件中也定义一个具有相同名字的命名空间

namespace  namespace_test{

int i;
int j; }

编译看看会出现什么惊喜呢。。。。

error: redefinition of `int namespace_test::i'

error: `int namespace_test::i' previously declared here

编译结果,可以表明,虽然命名空间分别定义在不同的文件中,空间上是离散的,但是编译器仍然认为两者是在同一个命名空间,所以会给出变量重复定义的错误!

OK,关于namespace的特性分析就暂时到这里,以后遇到会继续深入补充。。。。。

四、命名空间的类型

1、全局命名空间(global namespace)

2、内联命名空间(inline namesapce)

3、未命名的命名空间(unnamed namespace)

$$4.1理解什么是全局命名空间

书中说,全局命名空间是以隐式的方式声明,什么是隐式呢?也就是说,即使你什么也不做,你的代码中会一直漂浮着这么一张全局的网,你所定义、声明的变量、函数和类均在它的笼罩之下。当然对于这种看不见的网,也不是一点也摸不着的。对其内部的变量是可以通过下述的方式引用的:

::members  因为这个隐式的全局命名空间没有名字,所以就只能以无名英雄来称呼他了。

/***************************************************************************************************************/

$$4.2 理解什么是内联命名空间

定义:

inline  namespace  空间名称{

}

这个是C++11的新特性了

/***************************************************************************************************************/

$$4.3 理解什么是未命名空间

未命名空间仅仅在特定的文件内有效,不同文件的未命名空间不关联。此外,未命名空间声明的变量和语句,其声明周期一直延续到程序的结束,拥有静态生命周期。

在C语言中,我们一般用static关键词来定义全悲剧变量和函数,以保证其仅仅在当前文件内被访问。同样的道理,我们这里可以采用未命名空间来实现这一目的。

C++中已经取消了使用static的方法。