C++ 命名空间 namespace详解

文章目录

    • 1 . 前言
    • 2 . 命名冲突
    • 3 . 命名作用域
    • 4 . 匿名空间
    • 5 . 命名嵌套
    • 6 . 命名动态赋值
    • 7 . 命名空间追加内容
    • 8 . 命名空间指定
    • 9 . 小结


【极客技术传送门】 : https://blog.csdn.net/Engineer_LU/article/details/135149485


1 . 前言

  • 此篇博文详解C++的namespace命名空间
  • 平台 : Qt

2 . 命名冲突

C++ 命名空间 namespace详解_第1张图片

【Q】以上代码看起来似乎无问题,编译为什么出现错误?
【A】因为stdlib中也有rand,因此产生命名冲突

C++ 命名空间 namespace详解_第2张图片

【Q】怎么解决冲突问题?
【A】上图把用到的变量加前缀命名,以此区分变量,声明一个命名空间namespace MySpace,这里的MySpace是自定义命名,编译运行就正常了,打印出两个rand的地址,可以看到两个rand的地址是不一样的,就好比这个世界上有很多人叫张伟,广东有个张伟,上海也有个张伟,那么只需要在前缀声明 广东::张伟 或者 上海::张伟 ,同理以此来区分同一个变量名



3 . 命名作用域

C++ 命名空间 namespace详解_第3张图片

【Q】以上代码看起来似乎无问题,编译为什么出现错误?
【A】因为namespace的 作用域必须在全局 ,上图在局部区域声明,因此编译异常。



4 . 匿名空间

C++ 命名空间 namespace详解_第4张图片

【Q】以上代码看起来似乎无问题,编译为什么出现错误?
【A】因为上图中namespace设为 匿名空间相当于static ,上图中stdlib有一个rand,匿名也有一个rand,那么使用时未标注用的哪个命令空间下的rand,因此编译时不知道你要用哪个空间的rand,因此报错,因此如果要用匿名空间里的变量,只能把其他移除掉



5 . 命名嵌套

C++ 命名空间 namespace详解_第5张图片

上图两个rand的地址是不同的,说明不是同一个,因此可以支持嵌套使用命名空间,使用的时候加上前缀就可以了。



6 . 命名动态赋值

C++ 命名空间 namespace详解_第6张图片

上图看到在运行过程中,命名空间可以动态赋值

7 . 命名空间追加内容

C++ 命名空间 namespace详解_第7张图片

上图看到第一次定义命名空间包含了内容后,后续依然可以继续追加内容

8 . 命名空间指定

C++ 命名空间 namespace详解_第8张图片

上图看到有两个命名空间都定义了同一个内容的情况下,可以使用 using namespace xxx 来让往后指定对应xxx命名空间的内容,但是有个注意事项,如下图所示

C++ 命名空间 namespace详解_第9张图片

【Q】上图中为什么会报错?
【A】因为using namespace xxx 只能在某个作用域下声明一个命名空间,如果用using namespace xxx 声明了两个不同的命名空间,编译器就不知道往后的内容是以哪个命名空间为准,这里可能有个疑问,最后面声明的不应该可以确定吗?因为C++不希望太复杂,虽然C++已经较为复杂了,想象一下假设在一个作用域不断的声明,那么一旦程序大起来有20000行,里面用using namespace xxx 声明几百个命名空间,假设写程序的人没有对每个变量都加前缀,那后面的人看第14384行某个变量,这时候怎么知道是哪个命名空间的?往上慢慢翻么…写程序最忌讳就是这样的操作!因此禁止了这个行为。

9 . 小结

以上用实际的平台来跑C++的namespace特性,问题逻辑梳理清晰且简洁,谢谢观看。

技术交流QQ群 : 745662457
群内专注 - 问题答疑,项目外包,技术研究

你可能感兴趣的:(嵌入式,c++,数据库,开发语言,单片机,c语言)