👦个人主页:@Weraphael
✍🏻作者简介:目前学习C++和算法
✈️专栏:C++航路
🐋 希望大家多多支持,咱一起进步!😁
如果文章对你有帮助的话
欢迎 评论💬 点赞👍🏻 收藏 📂 加关注✨
标题
- 一、问题引入
- 二、什么是域(部分)
- 2.1 全局域和局部域
- 2.2 命名空间域
- 2.3 如何同时访问三个域的变量
- 2.4 三种域访问的优先问题
- 2.5 访问命名空间域的方法
- 三、使用using namespace的危害
- 四、命名空间的嵌套
- 五、总结
一、问题引入
- 看看以下一串简单的C语言代码
首先它是能在
VS
上编译通过的,并且在屏幕上打印了rand:600
。但接下来我加上#include <stdlib.h>
,代码是否还能正常编译通过呢?
rand
重定义?这是为什么?
原因是:rand
是stdlib
库中的一个函数(如下图所示),当编辑器编译代码时,#include <stdlib.h>
就会被展开,相当于全局有一个rand
函数,因此导致变量名和函数名相同,引发了命名冲突问题。
【总结】
C语言存在命名冲突问题:
- 可能与函数库中冲突
- 可能与同组开发冲突
因此,为了解决C语言命名冲突问题,C++引入了
namespace
这个关键字,用来定义一个命名空间域,其作用可以防止命名冲突问题。格式如下://name -- 名字随便取 namespace name { int rand = 10000; }
二、什么是域(部分)
2.1 全局域和局部域
main
函数外的变量a
称为全局域,main
函数内部的变量a
则称为局部域。而且,以上的代码是可以编译成功的,因为不同的域可以定义同名变量,但相同的域不能定义同名变量;并且,当全局域和局部域命名冲突时,优先访问局部域,因此以上代码打印的结果为1
(局部域)
2.2 命名空间域
2.3 如何同时访问三个域的变量
- 如果当全局域、局部域和命名空间域发生命名冲突,正常来说局部域是直接访问,但如果我还想访问全局域和命名空间域的变量,那该怎么做呢?
- 全局域没什么好说的,直接访问
::
是域作用限定符。表示变量a
去域作用限定符左边空白搜索,而这个空白代表的是全局域- 同理的,若想访问命名空间域的变量,在域作用限定符前加上命名空间域的名字即可,表示的是变量
a
去wj
这个域搜索变量
2.4 三种域访问的优先问题
当全局域、命名空间域和局部域同时存在,根据变量搜索原则,优先访问的是局部域
其次优先访问全局域
但是,它不会直接去命名空间搜索
这就要涉及到如何访问命名空间域
2.5 访问命名空间域的方法
- 指定方式(域作用限定符)
- 展开方式
因此,
C++
中的using namespace std
的意思就是展开标准库(std
)的命名空间
三、使用using namespace的危害
注意:展开了就相当于暴露在全局环境下了(相当于全局变量)。因此,如果全局域也有一个命名相同的变量,就会产生命名冲突,也就报错了
【总结】
从此可以看出,其实使用using namespace
的效果也是不佳的,因为它把命名空间展开后,域中的变量就相当于全局变量,而命名空间域的意义就是为了防止命名冲突的。因此不能轻易使用using namespace
【建议】
- 建议在写项目不要使用
using namespace
,在项目中最好是指定一些常用的把它展开。比如:using std::cout
- 在日常练习写代码时,可以随意使用
四、命名空间的嵌套
【结果展示】
ps:嵌套可以存在有同名变量
【结果展示】
最后,同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。
五、总结
本章是补充C语言语法的不足,以及C++是如何对C语言设计不合理的地方进行优化的。