文章目录
- 1 . 前言
- 2 . 命名冲突
- 3 . 命名作用域
- 4 . 匿名空间
- 5 . 命名嵌套
- 6 . 命名动态赋值
- 7 . 命名空间追加内容
- 8 . 命名空间指定
- 9 . 小结
【极客技术传送门】 : https://blog.csdn.net/Engineer_LU/article/details/135149485
1 . 前言
- 此篇博文详解C++的namespace命名空间
- 平台 : Qt
2 . 命名冲突
【Q】以上代码看起来似乎无问题,编译为什么出现错误?
【A】因为stdlib中也有rand,因此产生命名冲突
【Q】怎么解决冲突问题?
【A】上图把用到的变量加前缀命名,以此区分变量,声明一个命名空间namespace MySpace,这里的MySpace是自定义命名,编译运行就正常了,打印出两个rand的地址,可以看到两个rand的地址是不一样的,就好比这个世界上有很多人叫张伟,广东有个张伟,上海也有个张伟,那么只需要在前缀声明 广东::张伟 或者 上海::张伟 ,同理以此来区分同一个变量名
3 . 命名作用域
【Q】以上代码看起来似乎无问题,编译为什么出现错误?
【A】因为namespace的 作用域必须在全局 ,上图在局部区域声明,因此编译异常。
4 . 匿名空间
【Q】以上代码看起来似乎无问题,编译为什么出现错误?
【A】因为上图中namespace设为 匿名空间相当于static ,上图中stdlib有一个rand,匿名也有一个rand,那么使用时未标注用的哪个命令空间下的rand,因此编译时不知道你要用哪个空间的rand,因此报错,因此如果要用匿名空间里的变量,只能把其他移除掉
5 . 命名嵌套
上图两个rand的地址是不同的,说明不是同一个,因此可以支持嵌套使用命名空间,使用的时候加上前缀就可以了。
6 . 命名动态赋值
上图看到在运行过程中,命名空间可以动态赋值
7 . 命名空间追加内容
上图看到第一次定义命名空间包含了内容后,后续依然可以继续追加内容
8 . 命名空间指定
上图看到有两个命名空间都定义了同一个内容的情况下,可以使用 using namespace xxx 来让往后指定对应xxx命名空间的内容,但是有个注意事项,如下图所示
【Q】上图中为什么会报错?
【A】因为using namespace xxx 只能在某个作用域下声明一个命名空间,如果用using namespace xxx 声明了两个不同的命名空间,编译器就不知道往后的内容是以哪个命名空间为准,这里可能有个疑问,最后面声明的不应该可以确定吗?因为C++不希望太复杂,虽然C++已经较为复杂了,想象一下假设在一个作用域不断的声明,那么一旦程序大起来有20000行,里面用using namespace xxx 声明几百个命名空间,假设写程序的人没有对每个变量都加前缀,那后面的人看第14384行某个变量,这时候怎么知道是哪个命名空间的?往上慢慢翻么…写程序最忌讳就是这样的操作!因此禁止了这个行为。
9 . 小结
以上用实际的平台来跑C++的namespace特性,问题逻辑梳理清晰且简洁,谢谢观看。
技术交流QQ群 : 745662457
群内专注 - 问题答疑,项目外包,技术研究