
<p id="354PP975">译者注:可能很多程序员对C++已经非常熟悉,但是对命名空间经常使用到的地方还不是很明白,这篇文章就针对命名空间这一块做了一个叙述。</p><p id="354PP976">命名空间在1995年被引入到 c++ 标准中,通常是这样定义的:</p><p id="354PP977">命名空间定义了新的作用域。它们提供了一种避免名称冲突的方法。</p><p id="354PP978">c++ 中的命名空间通常用于避免命名冲突。尽管命名空间在最近的 c++ 代码中广泛使用,但大多数较旧代码都不使用此工具。</p><p id="354PP979">基于对众多C++项目源码的探索与研究,总结出了在这些项目中使用命名空间的一些常见原因。</p><p id="354PP97A">避免名称冲突</p><p class="f_center"><img src="https://nimg.ws.126.net/?url=http%3A%2F%2Fdingyue.ws.126.net%2F2024%2F1104%2F2ae36977j00smex7b0006d000b30071m.jpg&thumbnail=660x&quality=80&type=jpg"/><br/><br/></p><p id="354PP97C">如前所述,这是在C++中使用命名空间最常见的原因,在这种情况下,它们的用只是对编译器有效。无法为开发人员在代码可读性和维护性方面带来什么价值。</p><p id="354PP97D">模块化应用程序</p><p id="354PP97E">命名空间采取 “Namespace-by-feature ”的方法使代码模块化。”Namespace-by-feature” 通过命名空间来反映功能集。它将具有相互关联的项归类在同一个命名空间。这会形成具有高内聚低耦合(译者注:高内聚是指一个软件模块是由相关性很强的代码组成,只负责一项任务。耦合是一个软件结构内不同模块之间互连程度的度量)、模块性很强的命名空间。</p><p id="354PP97F">Boost是按功能分组的**示例, 它包含数以千计的命名空间, 每一个都用于对特定功能进行分组。</p><p id="354PP97G">匿名命名空间</p><p id="354PP97H">匿名的命名空间可避免产生全局静态变量。您创建的 “匿名” 命名空间只能在创建它的文件中访问。</p><p id="354PP97I">解决枚举类型成员重名问题</p><p id="354PP97J">如果在同一个作用域内定义了具有相同名称的枚举,C++中的“传统”枚举会在其作用域内导出枚举值,可能会导致名称冲突,</p><p id="354PP97K">在一个大型项目中,不能保证两个不同的枚举都不会以同名命名。这个问题在C++ 11中已经得以解决,它使用枚举类,隐式地对枚举名称中的枚举值进行定义。</p><p id="354PP97L">许多年前, 使用在命名空间内声明枚举的技巧解决这个问题, 而不是像这样声明枚举</p><p id="354PP97M">enum status{</p><p id="354PP97N">status_ok,</p><p id="354PP97O">status_error</p><p id="354PP97Q">它在命名空间中声明:</p><p id="354PP97R">namespace status{</p><p id="354PP97S">enum status{</p><p id="354PP97T">ok,</p><p id="354PP97U">error</p><p id="354PP981">许多 c++ 项目使用此技巧,例如Unreal Engine(译者注:UNREAL ENGINE中文名称为“虚幻引擎” ,是目前世界最知名授权最广的顶尖游戏引擎,占有全球商用游戏引擎80%的市场份额)源代码就广泛使用此技术。</p><p id="354PP982">隐藏实现</p><p class="f_center"><img src="https://nimg.ws.126.net/?url=http%3A%2F%2Fdingyue.ws.126.net%2F2024%2F1104%2Fc60c479ej00smex7b000ld000dw0086m.jpg&thumbnail=660x&quality=80&type=jpg"/><br/><br/></p><p id="354PP984">对于在头文件中实现的模板库,开发者在调用时不需要用到特殊的数据类型,因为他们只专注于功能的实现,所以对于找到一种适合开发者调用库的方法是很有趣的。在c#中, “internal” 关键字做了这项工作, 但是在c++中,没有办法将公有数据类型完全对开发者进行隐藏。</p><p id="354PP985">在模块中将定义和实现分离,是由Boost库开发者们创建的一个c++惯用语法,但这些定义必须按照规则放入到一个可供开发者调用sub-namespace(子命名空间)中。</p><p id="354PP986">例如在 boost::math文档中, 它指定:</p><p id="354PP987">不适用于应用程序的函数是在 boost::math::detail中。</p><p class="f_center"><img src="https://nimg.ws.126.net/?url=http%3A%2F%2Fdingyue.ws.126.net%2F2024%2F1104%2Fd2895b7bj00smex9500fsd000fz00d9p.jpg&thumbnail=660x&quality=80&type=jpg"/><br/><br/></p>
讯享网

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/146085.html