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

命名空间————————

一、namespace的价值

在C/C++中变量、函数、类等都是大量存在的,这些变量、函数和类的名称都存在于全局作用域中,可能会导致冲突。

为了避免这些冲突的产生所以我们使用namespace这种命名空间来对标识符的名称进行本地化。

我们来看下面这段代码:

#include<stdio.h>
#include<stdlib.h>int rand = 10;int main()
{printf("%d ", rand);return 0;
}

error C2365: “rand”: 重定义;以前的定义是“函数”

在这里报出了一个错误,“rand”重定义,以前的定义是“函数” 就是因为所在空间的原因造成的,rand是一个全局的变量,在这个文件中引入了rand这个函数,那么他就会因为同样的的名字造成重定义的错误。要解决这样的情况就需要使用命名空间来进行处理,

二、namespace的定义

定义命名空间,需要使用namespace关键字,后面跟命名空间的名字,然后介意对{}即可,{}中即为命名空间的成员。命名空间中可以定义变量、函数、类型等。

namespace的本质是定义出一个域,这个域和全局域各自独立,不同的域可以定义同名变量,所以我们来看下面的rand不再冲突了:

namespace XL
{int rand = 10;
}int main()
{printf("%d ", XL::rand);return 0;
}

在这里不会出现任何的冲突,此时就解决了变量、函数、类等定义过多导致的命名冲突问题。

C++中有函数局部域、全局域、命名空间域、类域;域的存在会影响编译器编译时查找对应的变量、函数等的逻辑,而且局部域和全局域还会影响变量的生命周期,命名空间域和类域不影响变量的生命周期。

1、namespace定义的命名空间可以定义多种类型的数据:
namespace XL
{int rand = 10;struct XLs{int s;char c;};int Add(int x, int y){return x + y;}
}
2、命名空间是可以嵌套的
namespace XL
{int rand = 10;struct XLs{int s;char c;};int Add(int x, int y){return x + y;}namespace XLL{int rand = 100;struct XLs{int s;char c;};int Add(int x, int y){return x + y;}}
}

在这个嵌套的空间中我们可以定义名称相同的变量、函数、结构体等,并不会出现任何问题。

3、命名空间在不同的文件中定义相同的空间名,编译器会默认他们是在同一个域中

我们来看下面这段代码:

//test.h
#include<stdio.h>
#include<stdlib.h>namespace XL
{int rand = 10;struct XLs{int s;char c;};int Add(int x, int y){return x + y;}
}//test.cpp
#include"test.h"namespace XL
{int rand_copy = rand;
}int main()
{printf("%d ", XL::rand_copy);return 0;
}

在这里我们在别的文件中使用头文件中定义的数据是可以正常使用的,也就说明了在这里,被命名空间只要名字相同定义的变量在其他文件中同样可以被访问。

三、命名空间的使用

编译查找一个变量的定义/声明时,默认只会在局部或者全局查找,所以我们直接对命名空间中的数据进行访问会导致程序报错,我们可以使用下面这几种方式来进行访问:

方式一:
namespace XL
{int rand = 10;struct XLs{int s;char c;};int Add(int x, int y){return x + y;}
}int main()
{//指定命名空间的访问,在项目中我们也推荐使用这种用法printf("%d ", XL::rand);return 0;
}
方式二:
namespace XL
{int rand = 10;struct XLs{int s;char c;};int Add(int x, int y){return x + y;}
}指定命名空间的访问,在项目中我们也推荐使用这种用法
//int main()
//{
//	printf("%d ", XL::rand);
//	return 0;
//}//using将命名空间中的成员展开,项目中经常访问的不存在冲突的成员推荐这中方式
using XL::rand;int main()
{printf("%d ", rand);return 0;
}
方式三:
namespace XL
{int rand = 10;int n = 10;struct XLs{int s;char c;};int Add(int x, int y){return x + y;}
}// 展开命名空间中的所有成员,不推荐在项目中使用
// 并且即使展开了,有冲突的数据还是可能报错,但仅在联系中使用是可以的
using namespace XL;int main()
{printf("%d ", n);return 0;
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • PMP--二模--解题--1-10
  • 2024.9.12(k8s环境搭建2)
  • postgresql-patroni高可用安装部署
  • 【Elasticsearch】-7.17.24版本接入
  • 自定义复杂AntV/G6案例
  • FreeRTOS学习——接口宏portmacro.h
  • 微波无源器件 功分器 4 一种用于天线阵列的紧凑宽带四路双极化波导功分器
  • 独立站技能树之建站33项自检清单 1.0丨出海笔记
  • 【STM32系统】基于STM32设计的SD卡数据读取与上位机显示系统(SDIO接口驱动、雷龙SD卡)——文末资料下载
  • golang学习笔记29——golang 中如何将 GitHub 最新提交的版本设置为 v1.0.0
  • 虚幻引擎 | (类恐鬼症)玩家和NPC语音聊天(下)
  • 观成科技:新版suo5隧道工具加密流量跟踪分析
  • # dbt source dbt source freshness命令详解
  • 【Linux 20】线程控制
  • IP包头分析
  • centos安装java运行环境jdk+tomcat
  • HTML中设置input等文本框为不可操作
  • JavaScript类型识别
  • Javascript设计模式学习之Observer(观察者)模式
  • JavaScript设计模式之工厂模式
  • JS函数式编程 数组部分风格 ES6版
  • js继承的实现方法
  • k8s如何管理Pod
  • Linux下的乱码问题
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • Python学习之路13-记分
  • Vue 2.3、2.4 知识点小结
  • vue-router的history模式发布配置
  • Web设计流程优化:网页效果图设计新思路
  • 给新手的新浪微博 SDK 集成教程【一】
  • 记一次删除Git记录中的大文件的过程
  • 今年的LC3大会没了?
  • 如何在GitHub上创建个人博客
  • 跳前端坑前,先看看这个!!
  • 消息队列系列二(IOT中消息队列的应用)
  • 学习HTTP相关知识笔记
  • ​14:00面试,14:06就出来了,问的问题有点变态。。。
  • ​LeetCode解法汇总2808. 使循环数组所有元素相等的最少秒数
  • #pragma预处理命令
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (13)Hive调优——动态分区导致的小文件问题
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (C++17) std算法之执行策略 execution
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (规划)24届春招和25届暑假实习路线准备规划
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (十六)视图变换 正交投影 透视投影
  • (十五)devops持续集成开发——jenkins流水线构建策略配置及触发器的使用
  • (十一)c52学习之旅-动态数码管
  • (译) 函数式 JS #1:简介
  • (转) Android中ViewStub组件使用
  • ./configure,make,make install的作用(转)
  • .net core IResultFilter 的 OnResultExecuted和OnResultExecuting的区别
  • .net core 连接数据库,通过数据库生成Modell
  • .Net OpenCVSharp生成灰度图和二值图