概要
使用命名空间的目的是对标识符的名称进行本地化, 以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。
我们定义的全局变量rand与库函数中的rand函数产生冲突,所以报错了。
C语言没办法解决类似这样的命名冲突问题,所以C++提出了namespace来解决
(wmm是命名空间的名字,一般开发中是用项目名字做命名空间名。)
使用了namespace解决了冲突的问题。
命名空间定义
定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{} 中即为命名空间的成员。
1.正常的命名空间定义
2.命名空间嵌套
3. 同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。
(一个工程中的test.h和上面test.cpp中两个wmm1会被合并成一个)
命名空间使用
1.加命名空间名称及作用域限定符
2.使用using将命名空间中某个成员引入
(左图)使用using wmm1::a的好处是不需要那么麻烦,一直的写“wmm1::a”,可以简写成a或者 ::a
(右图)因为编译器查找的顺序是,先局部,再全局,最后在namespace,所以当有局部变量存在且与namespace中的变量命名一样的话,就会打印出局部变量的值。
同时,因为编译器先局部,再全局,最后在namespace的顺序,所以在使用using wmm1::a 进行展开的话(展开就相当于提升了了查找的顺序),当全局的命名与namespace中的变量一样的话,使用::a或者wmm1::a打印就会产生冲突。
解决方式:1.若使用using wmm1::a ,注意namespace中的变量与全局变量是否命名相同。2.不要使用using wmm1::a
3.使用using namespace 命名空间名称引入
上面那个是namespace中的某个,而这个是指将namespace中的所有都展开。
如果有什么不理解的地方,可以上手试一下~试试就会啦~