C++ 命名空间 namespace详解


【全文大纲】 : 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
群内专注 - 问题答疑,项目外包,技术研究

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

极客 - L U

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值