1.namespace产生原因
在C语言中,变量,函数,以至于类都是大量存在的,因此会产生大量的名称存在于全局作用域中,可能产生很多冲突,至此c++的祖师爷为避免命名冲突和名字的污染,造出来了关键字namespace来解决这种问题
1.2查找规则
c/c++规定用任何变量类型的函数都要向上访问,在向上的过程中去找到他的出处在编译时候查找没有在去全局中找。
例如;
在c语言中rand是包含在头文件#include<stdlib,h>中的函数,因此编译器无法判断是函数还是变量。但事实上用c++可以完美解决。
2.namespace的特点
2.1用namespace来定义命名空间
后加名字加{成员},可定义变量/函数/类型。
1.在命名空间中定义的变量。
2.定义函数。
3.定义结构体类型。
2.2本质是定义一个全局域各自独立
如2.1中的a在不同的域中可以定义同名且不冲突。
2.3 c++中的域
函数局部域,全局域,命名空间域,类域;域影响的是编译时语法查找⼀个变量/函数/ 类型出处(声明或定义)的逻辑,所有有了域隔离,名字冲突就解决了。局部域和全局域除了会影响 编译查找逻辑,还会影响变量的⽣命周期,命名空间域和类域不影响变量⽣命周期。
域的名字在自己内部只能用一次,同一个域名字不能重复,但不同的域可以
2.4 namespace只能定义在全局,当然他还可以嵌套定义
图1;嵌套后要区别调用
图二注:当库很大或项目大还可以套中套来解决命名冲突
2.5项⽬⼯程中多⽂件
项⽬⼯程中多⽂件中定义的同名namespace会认为是⼀个namespace,不会冲突。
多⽂件中可以定义同名namespace,他们会默认合并到⼀起,就像同⼀个namespace⼀样
定个文件一个命名空间都会封在一起
例如:当同时定义栈与队列 会产生多个文件
3.命名空间使用
编译查找⼀个变量的声明/定义时,默认只会在局部或者全局查找,不会到命名空间⾥⾯去查找。所以 下⾯程序会编译报错。所以我们要使⽤命名空间中定义的变量/函数,有三种⽅式:
3.1指定命名空间访问
不易出错,推荐使用
3.2 展开命名空间中全部成员(展开头文件与命名空间的区别)
展开命名空间中全部成员--》变成全局变量因此可能造成命名冲突
展开头文件是将头文件在预处理阶段将头文件的代码拷贝过来
不推荐,冲突风险大,但是在小练习中为方便推荐使用。
3.3折中using将命名空间中某个成员展开
当a用的不多但是b用的多是将b解开变成全局;
项⽬中经常访问的不存在冲突的成员推荐这种⽅式