一、什么是namespace?
namesapce是为了防止名字冲突提供的一种控制方式。
当一个程序需要用到很多的库文件的时候,名字冲突有时无法避免。之前的解决思路是使用更长的变量名字,使用不方便。
二、命名空间的定义
1、namespace 空间名称 {
变量;
函数;
类;
}
三、命名空间的特点
1、每个命名空间都有自己的作用域;
2、命名空间可以是不连续的,正像代码中的所列举的例子;
1.1 如何理解命名空间的作用域
1 namespace global_namespace{ 2 3 4 namespace local_namespace_1{ 5 6 int i; 7 int j; 8 } 9 10 11 namespace local_namespace_2{ 12 13 int i; 14 int j; 15 } 16 17 18 19 }
LINE6~7和LINE13~14均定义相同的变量,但是不会冲突;
因为引用的时候分别为
global_namespace::local_namespace_1::i=10;
global_namespace::local_namespace_2::i=10;
在使用的时候,需要明确的指出变量所在的空间,因为不会冲突啦!不过这种写法,看着就有崩溃的赶脚。
幸好,在同一个命名空间内的应用是不需要这样啰嗦的
1 namespace local_namesapce_3{ 2 int i=10; 3 int j=10; 4 5 6 int sum = i+j; //这里是不需要写出变量所在的命名空间的 7 8 9 }
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 理解什么是未命名空间