当前位置: 首页 > article >正文

C++篇 ---- 命名空间namespace

由于在c语言中在定义时可能会出现重命名现象,造成空间冲突,c语言中有命名冲突:1 和库冲突。2 互相之间的冲突,变量命名冲突。所以c++中就有了对其改进的关键字namespace,针对重定义,解决空间冲突。

文章目录

  • 命名空间namespace


命名空间namespace

以下是c语言实现的代码

#include<stdio.h>
#include<stdlib.h>

int rand = 1;

int main()
{
	printf("%d\n", rand);
	return 0;
}

在这里插入图片描述
这里会报错是由于变量rand与库函数中的rand相同,导致了命名冲突

如何解决命名冲突?

使用namespace。

此时修改rand的域,用域对rand进行隔离,同一个域中不能定义相同变量,因此将其隔离到其它域中

  • 类域
  • 命名空间域
  • 局部域
  • 全局域

而此时要将其修改到命名空间域中去。

当一个程序中一个变量在局部和全局并且命名空间都有创建时,编译器优先搜索访问的是局部,再全局如果命名空间域展开(展开命名空间是指编译器是否会到命名空间搜索) 的话再命名空间,否则是不会搜索访问命名空间的

展开命名空间(using naespace std):

  1. 命名空间直接展开有风险,定义和库重合会报错
  2. 建议项目中不要去展开,在我们日常用的时候展开没什么大问题
  3. 推荐指定访问,指定展开c++常用的,如 using namespace cout,using namespace cin,using namespace endl
//全局域
int a = 1;

//命名空间域
namespace zzm
{
	int a = 2;
}


int main()
{
	//局部域
	int a = 0;
	printf("%d\n", a);
	return 0;
}

在这里插入图片描述

无局部时
在这里插入图片描述
当变量只在命名空间域有定义时
在这里插入图片描述

此时并没有将命名空间展开using或者加域作用限定符::,就相当于编译器不知道这个命名空间,所以也就搜索不到变量a,而此时可以加域作用限定符或者展开命名空间

在这里插入图片描述
在这里插入图片描述

是指在这个命名空间里去搜索找变量a,zzm::指定到命名空间zzm中搜索,其左边zzm的为命名空间的名字,

如果左边的为空白 :: 就表示在全局域去搜索查找

在这里插入图片描述

其实在编译器中它在定义或者使用时会向前面查找,搜索是否有相同或者存在,而在搜索时又先从局部域开始,局部域没有全局域,如果都没有是不会默认到命名空间域搜索的,只有将其展开using或者使用域限定符::指定访问命名空间域

namespace zzm
{
	int a = 2;
}

using namespace zzm;

int main()
{
	//局部域
	//int a = 0;//将局部屏蔽
	printf("%d\n", a);
	return 0;
}

在这里插入图片描述

但是将其命名空间展开之后有不可与全局同时用,因为此时编译器并不确定是命名空间域的还是全局域的

在这里插入图片描述

不展开:相同变量在不同域中可以同时存在,只是需要使用域限定符搜索指定命名空间
命名空间展开:也就将封在命名空间里面的内容暴露在全局域了,就如上面,此时编译器也不确定访问谁
在这里插入图片描述

而由开始引出的变量命名与库中相同时,也就有了解决方法。将这个变量定义到命名空间域中,直接在命名空间搜索访问

#include<stdio.h>
#include<stdlib.h>

namespace lsy
{
	int rand = 1;
}

int main()
{
	printf("%d\n", lsy::rand);
	return 0;
}

在这里插入图片描述
此时也就解决了命名冲突问题了。

命名空间里面不仅仅可以定义变量还可以定义函数,结构体任意类型。且也可以嵌套命名空间

namespace n1
{
    int a = 0;
    int b;
    int Add(int left, int right)
    {
        return left + right;
    }

    namespace n2
    {
        int a = 1;
        int c;
        int d;
        int Sub(int left, int right)
        {
            return left - right;
        }
    }
}

int main()
{
    printf("%d\n", n1::a);
    printf("%d\n", n1::n2::a);//不过嵌套在搜索时先搜索外边的然后再搜索里面嵌套的
    //就像盒子都要先打开外边的叭
    printf("%d\n", n1::Add(1, 2));
    //
    return 0;
}

在这里插入图片描述

而c++的库和stl都封在一个命名空间std中,c++库中的东西都在std中,像cout,cin,endl啊这些常见的都是命名空间std中的


可以说namespace是解决c语言的命名冲突而出现的


http://www.kler.cn/a/10529.html

相关文章:

  • 基于BILSTM及其他RNN序列模型的人名分类器
  • Linux下MySQL的简单使用
  • Matlab实现鹈鹕优化算法(POA)求解路径规划问题
  • 机器学习———特征工程
  • 【信号处理】基于联合图像表示的深度学习卷积神经网络
  • 计算机毕业设计Python+图神经网络考研院校推荐系统 考研分数线预测 考研推荐系统 考研爬虫 考研大数据 Hadoop 大数据毕设 机器学习 深度学习
  • 华为MatePad有什么好用的软件?
  • 用SSH登陆Centos系统时,命令行最前面显示“的提示符[root@www myapp]”是什么意思?
  • 【博学谷学习记录】超强总结,用心分享丨人工智能 AI项目 统计语言模型之HMM初步学习总结
  • 基于Python实现的深度学习技术在水文水质领域应用
  • Java多线程:定时器Timer
  • C++之入门之缺省参数函数重载引用
  • 【活动】高效学习方法分享
  • 「VS」Visual Studio 常用小技巧
  • 【C语言】迷宫问题
  • CLIP:语言-图像表示之间的桥梁
  • Arcgis Engine之打开MXD文档
  • Linux less 命令
  • SpringBoot ElasticSearch 【SpringBoot系列16】
  • 归排、计排深度理解
  • docker运行服务端性能监控系统Prometheus和数据分析系统Grafana
  • 智慧校园大数据云平台(4)
  • 2023.04.16 学习周报
  • Java学习
  • 【数据结构】解析队列各接口功能实现
  • JS实用技巧断点调试详解