C++ 中命名空间的 5 个常见用法

Wesley13
• 阅读 401

相信小伙伴们对C++已经非常熟悉,但是对命名空间经常使用到的地方还不是很明白,这篇文章就针对命名空间这一块做了一个叙述。

命名空间在1995年被引入到 c++ 标准中,通常是这样定义的:

命名空间定义了新的作用域。它们提供了一种避免名称冲突的方法。 c++ 中的命名空间通常用于避免命名冲突。尽管命名空间在最近的 c++ 代码中广泛使用,但大多数较旧代码都不使用此工具。

基于对众多C++项目源码的探索与研究,总结出了在这些项目中使用命名空间的一些常见原因。

1-避免名称冲突

如前所述,这是在C++中使用命名空间最常见的原因,在这种情况下,它们的使用只是对编译器有效。无法为开发人员在代码可读性和维护性方面带来什么价值。

2-模块化应用程序

命名空间采取 “Namespace-by-feature ”的方法使代码模块化。”Namespace-by-feature” 通过命名空间来反映功能集。它将具有相互关联的项归类在同一个命名空间。这会形成具有高内聚低耦合(译者注:高内聚是指一个软件模块是由相关性很强的代码组成,只负责一项任务。耦合是一个软件结构内不同模块之间互连程度的度量)、模块性很强的命名空间。

Boost是按功能分组的最佳示例, 它包含数以千计的命名空间, 每一个都用于对特定功能进行分组。

3-匿名命名空间

匿名的命名空间可避免产生全局静态变量。您创建的 “匿名” 命名空间只能在创建它的文件中访问。

4-解决枚举类型成员重名问题

如果在同一个作用域内定义了具有相同名称的枚举,C++中的“传统”枚举会在其作用域内导出枚举值,可能会导致名称冲突,

在一个大型项目中,不能保证两个不同的枚举都不会以同名命名。这个问题在C++ 11中已经得以解决,它使用枚举类,隐式地对枚举名称中的枚举值进行定义。

许多年前, 使用在命名空间内声明枚举的技巧解决这个问题, 而不是像这样声明枚举

enum status{  
   status_ok,  
    status_error  
};

enum status{  
   status_ok,  
    status_error  
};

它在命名空间中声明:

namespace status{  
   enum status{  
     ok,
      error  
 };  
}

namespace status{  
   enum status{  
     ok,
      error  
 };  
}

许多 c++ 项目使用此技巧,例如Unreal Engine(译者注:UNREAL ENGINE中文名称为“虚幻引擎” ,是目前世界最知名授权最广的顶尖游戏引擎,占有全球商用游戏引擎80%的市场份额)源代码就广泛使用此技术。

5-隐藏实现

对于在头文件中实现的模板库,开发者在调用时不需要用到特殊的数据类型,因为他们只专注于功能的实现,所以对于找到一种适合开发者调用库的方法是很有趣的。在c#中, “internal” 关键字做了这项工作, 但是在c++中,没有办法将公有数据类型完全对开发者进行隐藏。

在模块中将定义和实现分离,是由Boost库开发者们创建的一个c++惯用语法,但这些定义必须按照规则放入到一个可供开发者调用sub-namespace(子命名空间)中。

最后还是要推荐下小编的C/C++学习群:710520381,邀请码(柳猫),不管你是小白还是大牛,小编我都欢迎,不定期分享干货,包括小编自己整理的一份2018最新的C/C++和0基础入门教程,欢迎初学和进阶中的小伙伴。

C++ 中命名空间的 5 个常见用法

点赞
收藏
评论区
推荐文章
Easter79 Easter79
3年前
tf.compat.v1的含义
为确保高版本的TF支持低版本的TF代码,升级脚本加入了compat.v1模块。此模块将以等效的tf.compat.v1.foo引用代替表单tf.foo的调用。不过,建议您手动检查此类替代方案,并尽快将其迁移至tf.\命名空间(代替tf.compat.v1.\命名空间)中的新API。承接Matlab、Python和C的编程
Wesley13 Wesley13
3年前
.NET的命名空间
关于Namespace(命名空间)的使用在前面的程序中我们看到,我常用<%@ImportNamespace"System.Data"%,这是在引用M$为我们提供的Namespace,这和ASP不同的,我们在ASP.net必须先引用与我们操作有关的Namespace后才能使用相应的功能。其实说白了,一个Namespace;就是一个组件。这个是关
Stella981 Stella981
3年前
C# Dictionary类型转json方法之一
usingNewtonsoft.Json;//引用命名空间Dictionary<string,stringContentnewDictionary<string,string();Content.Add("bulletinContent","thisisbulletinContent");C
Stella981 Stella981
3年前
Hive(七)Hive参数操作和运行方式
Hive参数操作和运行方式1、Hive参数操作1、hive参数介绍​hive当中的参数、变量都是以命名空间开头的,详情如下表所示:命名空间读写权限含义hiveconf可读写hivesite.xml当中的各配置变量例:hivehiveconf
Stella981 Stella981
3年前
OPENCV3 命名空间等变化
CV\_VERSION表示的opencv的版本号命名空间变化: 可以通过增加include<cv.h解决  1直接去掉CV\_前缀          1)nameWindow函数  CV\_WINDOW\_AUTOSIZE直接变成 WINDOW\_AUTOSIZE         
Wesley13 Wesley13
3年前
## 码出高效——小组代码规范
码出高效——小组代码规范编程规约一.命名风格1.代码中的命名不能以下划线、美元符号开头或结尾。反例:<fontcolorDC143Csize3\_name/$name/name&/name\_</font2.【强制】代码中的命名严禁使用拼音与英文混合的方式,更不
Stella981 Stella981
3年前
Opencv颜色识别与追踪
这是基于颜色识别的物体追踪不废话直接看代码这是Opencv3的代码//【头文件、命名空间包含部分】//描述:包含程序所使用的头文件和命名空间//
Stella981 Stella981
3年前
GO开发[二]:golang语言基础
一.变量1.声明变量变量相当于是对一块数据存储空间的命名,程序可以通过定义一个变量来申请一块数据存储空间,之后可以通过引用变量名来使用这块存储空间。Go语言引入了关键字var,而类型信息放在变量名之后,变量声明语句不需要使用分号作为结束符,示例如下:varv1intvarv2string
Wesley13 Wesley13
3年前
C++入门知识点总结
一、C中的命名空间C中使用命名空间来解决在相同文件或范围的同名变量问题,示例程序如下:include<iostreamusingnamespacestd;if0intg_count100;intg_count200;/
Stella981 Stella981
3年前
C++关键字之using的的用法总结
Cusing用法总结1)配合命名空间,对命名空间权限进行管理usingnamespacestd;//释放整个命名空间到当前作用域usingstd::cout;//释放某个变量到当前作用域2)类型重命名作用等同typedef,但是逻辑上更直观。include<iostream