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

原文:5 Common reasons of using namespaces in C++ projects
作者:CppDepend Team
翻译:王江平

译者注:可能很多程序员对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  
};

它在命名空间中声明:

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

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

5-隐藏实现

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

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

例如在 boost::math文档中, 它指定:

不适用于应用程序的函数是在 boost::math::detail中。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
C++命名空间是一种将全局作用域划分为不同部分的机制,用于避免命名冲突和组织代码。在iOS开发常见命名空间有以下几种: 1. 全局命名空间C++所有未显式放置于其他命名空间代码都位于全局命名空间。在iOS开发,全局命名空间主要用于定义全局常量、枚举类型和函数等。 2. 标准命名空间C++标准的类、函数和类型定义通常位于std命名空间。在iOS开发,如果你使用了C++标准的功能,你需要在代码使用std::前缀来访问这些定义。 3. 自定义命名空间:为了更好地组织代码并避免命名冲突,你可以创建自己的命名空间。例如,在iOS开发你可以创建一个自定义的命名空间来包含你的应用程序的所有类和函数。 下面是一个简单的示例,展示了如何使用自定义命名空间来组织代码: ```cpp // 在头文件定义命名空间 namespace MyApp { // 在命名空间定义类 class MyClass { public: void doSomething(); }; } // 在源文件实现命名空间的函数 namespace MyApp { void MyClass::doSomething() { // 实现代码 } } // 在其他文件使用命名空间的类和函数 int main() { MyApp::MyClass obj; obj.doSomething(); return 0; } ``` 在上面的示例,我们创建了一个名为MyApp的命名空间,并在其定义了一个名为MyClass的类和一个名为doSomething的成员函数。在其他文件,我们可以使用`MyApp::`前缀来访问这些定义。 需要注意的是,在Objective-C和Swift,通常会使用模块化的方式来组织代码,而不是直接使用C++命名空间。因此,在iOS开发,你可能会更多地使用Objective-C的命名规范和Swift的模块化机制来组织代码

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值