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

【C++指南】命名空间

       

          💓 博客主页:倔强的石头的CSDN主页 

           📝Gitee主页:倔强的石头的gitee主页

            ⏩ 文章专栏:《C++指南》

                                  期待您的关注

 

1b7335aca73b41609b7f05d1d366f476.gif

 

目录

一、命名空间的重要性

1.  C语言中没有命名空间而存在的问题

2.  C++引入了命名空间解决的问题

3.  C++命名空间的重要性

二、命名空间的定义

三、命名空间的使用

1. 指定命名空间访问​编辑

2.  using将命名空间中某个成员展开

3. 展开命名空间中全部成员


 

 注:本文为了将C与C++进行对比,皆使用了printf函数作为示例

 

一、命名空间的重要性

 

1.  C语言中没有命名空间而存在的问题

在C语言中,所有的全局标识符(包括函数名、变量名等)都位于同一个全局作用域中。这导致了几个显著的问题:

  1. 命名冲突:当多个库或模块包含相同名称的函数或变量时,这些标识符之间会发生冲突。开发者需要手动修改名称以避免冲突,这既繁琐又容易出错。

  2. 代码可读性差:随着项目规模的增大,全局作用域中的标识符数量急剧增加,使得代码的阅读和维护变得困难。开发者需要花费更多时间来理解每个标识符的来源和用途。

  3. 模块间耦合度高:由于所有全局标识符都可见,模块间的依赖关系可能变得复杂且难以管理。这增加了代码重构和模块化的难度。

 ​​​

 

比如:

在C语言中,如果定义一个rand全局变量,刚开始,可以正常打印90167588240c4174bfdb0ff0aa0e4dd7.png

 然后,包含了<stdlib.h>头文件之后,就报错了,因为在stdlib头文件中,rand是函数,这里我们又定义了以rand全局变量,就产生了命名冲突

f20cce11aaa44cae88a701df583f9363.png

 

2.  C++引入了命名空间解决的问题

C++通过引入命名空间(namespace)机制来解决上述问题:

  1. 解决命名冲突:命名空间允许开发者将相关的标识符组织在一起,并通过命名空间名称作为前缀来访问这些标识符。这样,即使不同的库或模块包含相同名称的标识符,只要它们位于不同的命名空间中,就不会发生冲突。

  2. 提高代码可读性:命名空间为代码提供了一种自然的分组方式,使得相关的标识符能够按照逻辑或功能进行组织。这有助于开发者快速理解代码的结构和每个标识符的用途。

  3. 降低模块间耦合度:通过限制命名空间成员的可见性,C++可以减少模块间的依赖关系。开发者可以更加灵活地重构和模块化代码,而无需担心意外的命名冲突或依赖问题。

 还是上面的例子,在C++中,将rand全局变量放在了命名空间中后,就不会与头文件中rand函数发生冲突

关于命名空间的定义和使用细则,会在稍后介绍

d9e26fb63cbc49a5aa082b1368f553b7.png

 

3.  C++命名空间的重要性

C++命名空间的重要性体现在以下几个方面:

  1. 支持大型项目:对于大型项目而言,命名空间是组织和管理代码的关键工具。它有助于减少命名冲突、提高代码可读性和可维护性。

  2. 促进模块化编程:命名空间鼓励开发者将代码划分为独立的模块或库,并通过命名空间来区分这些模块或库中的标识符。这有助于实现更加清晰和灵活的模块化编程。

  3. 与标准库集成:C++标准库中的所有内容都定义在std命名空间中。通过使用命名空间,标准库能够与用户代码和谐共存,而不会引发命名冲突。

  4. 增强代码复用性:命名空间使得库和框架的开发者能够更容易地提供可复用的代码。通过定义清晰的命名空间,他们可以避免命名冲突,并确保库或框架中的标识符在与其他代码集成时保持清晰和一致。

总之,C++命名空间是一种强大的代码组织工具,它有助于解决命名冲突、提高代码的可读性和可维护性。通过合理使用命名空间,你可以创建出更加清晰、模块化和可复用的C++代码

 

二、命名空间的定义

  • 定义命名空间——需要使⽤到namespace关键字,后⾯跟命名空间的名字,然后接⼀对{}即可,{}中 即为命名空间的成员。命名空间中可以定义变量/函数/类型等。
  • namespace本质是定义出⼀个域,这个域跟全局域各⾃独⽴,不同的域可以定义同名变量,所以下 ⾯的rand不在冲突了。
  • C++中域有函数局部域,全局域,命名空间域,类域;域影响的是编译时语法查找⼀个变量/函数/ 类型出处(声明或定义)的逻辑,所有有了域隔离,名字冲突就解决了。局部域和全局域除了会影响 编译查找逻辑,还会影响变量的生命周期;命名空间域和类域不影响变量生命周期,只影响作用域。
  •  namespace只能定义在全局,当然他还可以嵌套定义
  • 项⽬⼯程中多⽂件中定义的同名namespace会认为是⼀个namespace,不会冲突
  • C++标准库都放在⼀个叫std(standard)的命名空间中

405782351a014fadbf40f7b527d8b4c1.png

 

多文件定义同名的命名空间,它们会被当做是同一个命名空间,自动合并到一起

如下图所示:

deec2bb0f0a947c0b982255d39d7457f.png

132985efed00427189d0e1373c7a58f2.png

 

三、命名空间的使用

 

编译查找⼀个变量的声明/定义时,默认只会在局部或者全局查找,不会到命名空间⾥⾯去查找。所以 下⾯程序会编译报错。

所以我们要使⽤命名空间中定义的变量/函数,有三种⽅式:

 

  1. 指定命名空间访问项⽬中推荐这种⽅式
  2. using将命名空间中某个成员展开,项⽬中经常访问的不存在冲突的成员推荐这种⽅式。
  3. 展开命名空间中全部成员,项⽬不推荐,冲突⻛险很⼤,⽇常⼩练习程序为了⽅便推荐使⽤。

 

1. 指定命名空间访问

d9e26fb63cbc49a5aa082b1368f553b7.png

 

2.  using将命名空间中某个成员展开

b920b2a5d5814fa3b355aec8b5ba34ec.png

 

3. 展开命名空间中全部成员

ac0a688a841c4f26848d980e254bb30f.png

 

作为C++命名空间的基础介绍,本文讲解完毕

 

相关文章:

【C++指南】命名空间

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《C指南》 期待您的关注 目录 一、命名空间的重要性 1. C语言中没有命名空间而存在的问题 2. C引入了命名空间解决的问题 3.…...

RocketMQ Dashboard安装

RocketMQ Dashboard 是一个基于 Web 的管理工具&#xff0c;用于监控和管理 RocketMQ 集群。它提供了一个用户友好的界面&#xff0c;使管理员能够轻松地查看和操作 RocketMQ 系统中的各种组件和状态。 主要功能包括&#xff1a; 集群管理: 监控和管理 NameServer 和 Broker …...

前端web开发HTML+CSS3+移动web(0基础,超详细)——第3天

目录 一&#xff0c;列表-无序和有序的定义列表 二&#xff0c;表格-基本使用与表格结构标签 三&#xff0c;合并单元格 四&#xff0c;表单-input标签 五&#xff0c;表单-下拉菜单 六&#xff0c;表单-文本域 七&#xff0c;表单-label标签 八&#xff0c;表单-按钮 …...

认识MySQL

目录 数据库是什么呢&#xff1f;MySQL 数据库是什么呢&#xff1f; 在我们开始学习MySQL之前&#xff0c;先来了解一下&#xff0c;什么是数据库呢&#xff1f;我相信此时很多人会说是管理数据的&#xff0c;完全正确&#xff01;用数据库我们可以去存储大量的数据。我来给你…...

尚品汇-创建ES索引库(二十七)

目录&#xff1a; &#xff08;1&#xff09;商品检索功能介绍 &#xff08;2&#xff09;根据业务搭建数据结构 &#xff08;3&#xff09;nested 介绍 &#xff08;4&#xff09;搭建service-list服务 &#xff08;5&#xff09;构建实体与es mapping建立映射关系 &…...

设计模式-六大原则

概述 设计模式的六大原则是设计模式的基础&#xff0c;了解设计模式的原则&#xff0c;有利于设计模式实际应用的理解&#xff0c;在真实使用的时候&#xff0c;一般不太可能一个程序满足所有的设计模式六大原则&#xff0c;或多或少都会有违背设计模的地方&#xff0c;所以不…...

MyBatis搭建和增删改查

MyBatis是一个开源的持久层框架&#xff0c;用于处理数据库的增删改查操作。它能够将Java对象与数据库中的数据进行映射关系的配置&#xff0c;并自动生成对应的SQL语句&#xff0c;从而简化了数据库操作的编码工作。 MyBatis的核心思想是将SQL语句与Java代码分离&#xff0c;…...

【一图学技术】6.反向代理 vs API网关 vs 负载均衡的原理和使用场景

反向代理 vs API网关 vs 负载均衡 一、概念 ​ &#x1f30f;反向代理&#xff08;Reverse Proxy&#xff09;是一种位于服务器和客户端之间的代理服务器。 ​ 它接收来自客户端的请求&#xff0c;并将其转发给后端服务器&#xff0c;然后将后端服务器的响应返回给客户端。客…...

python爬虫番外篇 | Reuqests库高级用法(1)

文章目录 1.会话对象&#xff08;Session Objects&#xff09;2.请求和响应对象&#xff08;Request and Response Objects&#xff09;3.准备好的请求&#xff08;Prepared Requests&#xff09;4.SSL证书验证5.客户端证书6.CA 证书7.正文内容工作流程&#xff08;Body Conten…...

【链表OJ】常见面试题 3

文章目录 1.[环形链表II](https://leetcode.cn/problems/linked-list-cycle-ii/description/)1.1 题目要求1.2 快慢指针1.3 哈希法 2.[随机链表的复制](https://leetcode.cn/problems/copy-list-with-random-pointer/description/)2.1 题目要求2.2 迭代法 1.环形链表II 1.1 题目…...

Linux学习笔记9(Linux包管理)

目录 归档包管理 归档 查看归档包 解归档包 压缩包管理 Zip/unzip gzip/gunzip bzip2/bunzip2 源码包安装软件 三大步&#xff1a; 预备步骤&#xff1a;安装依赖的编译库 一、./configure --prefix/usr/local/nginx 二、make 三、make install 软件包安装 配置…...

论文阅读《Geometric deep learning of RNA structure》

引入了机器学习方法&#xff0c;通过少量的数据学习。只使用原子坐标作为输入。 预测RNA三维结构比预测蛋白质结构更困难。 设计了一个原子旋转等变评分器ARES&#xff0c;由每个原子的三维坐标和化学元素类型&#xff08;输入&#xff09;指定&#xff0c;ARES预测模型与未知真…...

宏集方案 | 传统建筑智能化改造,迈向物联新时代

前言 智能建筑涉及多个系统的集成&#xff0c;如照明、空调、安防等&#xff0c;这些系统的兼容性和协调运作是一大挑战。然而&#xff0c;传统的工业建筑和商业楼宇受早期设计的局限&#xff0c;多个控制系统间互不兼容&#xff0c;并且难以重新部署通信线缆。 针对传统建筑…...

如果服务器更改Web端口会减少被攻击的风险吗?

通过更改服务器的Web端口&#xff0c;是否能够显著降低被攻击的风险?首先&#xff0c;理解Web服务默认使用的端口是关键。HTTP协议通常使用80端口&#xff0c;而HTTPS则默认使用443端口。这些端口因其广泛认知而成为黑客攻击的首要目标。理论上&#xff0c;将Web服务迁移到非标…...

vim列编辑模式

在编辑文本时&#xff0c;经常会有这样的需求&#xff0c;对特定列进行进行批量编辑。比如批量注释一段代码&#xff0c;或者删除待定字符&#xff08;如一列空格&#xff09;。幸运的是VIM支持列编辑模式。 假设文本内容&#xff1a; Maximum length of a custom vocabulary…...

如何实现pxe安装部署

此实验环境&#xff1a;rhel7主机 一、kickstart自动化安装脚本 1、安装可视化图形 [rootlocalhost ~]# yum group install "Server with GUI" 2、关闭vmware dhcp功能&#xff08;编辑-虚拟网络编辑器&#xff09; 3、httpd 1、安装httpd服务 [rootlocalhost …...

机器学习常见模型

1、线性模型 线性模型是机器学习最基本的算法类型&#xff0c;它试图学到一个通过多个特征&#xff08;属性&#xff09;计算的线性组合来预测的函数&#xff0c;简单的线性回归形式如yaxb&#xff0c;其中&#xff0c;x代表特征&#xff0c;而y代表结果&#xff0c;一旦a和b的…...

【python案例】基于Python 爬虫的房地产数据可视化分析设计与实现

引言 研究背景与意义 房地产行业在我国属于支柱性产业&#xff0c;在我国社会经济发展中一直扮演着重要角色。房价问题&#xff0c;尤其是大中城市的房价问题&#xff0c;一直是政府、大众和众多研究人员关注的热点。如何科学地预测房价是房价问题的研究方向之一。随着互联网…...

如何在Python中诊断和解决内存溢出问题

python的内存溢出即程序在申请内存后未能正确释放&#xff0c;导致随着时间推移占用的内存越来越多&#xff0c;以下是一些可能导致内存溢出的原因&#xff1a; 1、循环引用&#xff1a;当对象之间形成循环引用&#xff0c;并且这些对象定义了__del__方法时&#xff0c;Python…...

什么是爬虫软件?这两个爬虫神器你必须要试试

爬虫软件概述 爬虫&#xff0c;又称为网络爬虫或网页爬虫&#xff0c;是一种自动浏览互联网的程序&#xff0c;它按照一定的算法顺序访问网页&#xff0c;并从中提取有用信息。爬虫软件通常由以下几部分组成&#xff1a; 用户代理&#xff08;User-Agent&#xff09;&#xf…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解

【关注我&#xff0c;后续持续新增专题博文&#xff0c;谢谢&#xff01;&#xff01;&#xff01;】 上一篇我们讲了&#xff1a; 这一篇我们开始讲&#xff1a; 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下&#xff1a; 一、场景操作步骤 操作步…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动&#xff08;如演唱会、马拉松赛事、高考中考等&#xff09;期间&#xff0c;城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例&#xff0c;暖城商圈曾因观众集中离场导致周边…...

全球首个30米分辨率湿地数据集(2000—2022)

数据简介 今天我们分享的数据是全球30米分辨率湿地数据集&#xff0c;包含8种湿地亚类&#xff0c;该数据以0.5X0.5的瓦片存储&#xff0c;我们整理了所有属于中国的瓦片名称与其对应省份&#xff0c;方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)

🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

今日科技热点速览

&#x1f525; 今日科技热点速览 &#x1f3ae; 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售&#xff0c;主打更强图形性能与沉浸式体验&#xff0c;支持多模态交互&#xff0c;受到全球玩家热捧 。 &#x1f916; 人工智能持续突破 DeepSeek-R1&…...

C++.OpenGL (14/64)多光源(Multiple Lights)

多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖

在Vuzix M400 AR智能眼镜的助力下&#xff0c;卢森堡罗伯特舒曼医院&#xff08;the Robert Schuman Hospitals, HRS&#xff09;凭借在无菌制剂生产流程中引入增强现实技术&#xff08;AR&#xff09;创新项目&#xff0c;荣获了2024年6月7日由卢森堡医院药剂师协会&#xff0…...

【网络安全】开源系统getshell漏洞挖掘

审计过程&#xff1a; 在入口文件admin/index.php中&#xff1a; 用户可以通过m,c,a等参数控制加载的文件和方法&#xff0c;在app/system/entrance.php中存在重点代码&#xff1a; 当M_TYPE system并且M_MODULE include时&#xff0c;会设置常量PATH_OWN_FILE为PATH_APP.M_T…...