Use Namesapce 使用方法简介

命名空间(namespace)在C++中的作用非同一般。本文目的不在于阐述命名空间的语法,而在于演示命名空间的使用方法,或者说是使用命名空间的小窍门。

命名空间可以简单的将一些命名(name)用另一个命名打包封装起来。比方说:

1.namespace net {

2.class Socket {

3....

4.};

5.}

6....

7.net::Socket socket;

经过这样的封装以后,如果在两个库(library)都实现了Socket类,只要它们命名空间的名字不同,你就可以同时使用它们而没有任何命名上的冲突。

但这样做还是有问题:假如两个公司都要写一个network库,那么当她们编写代码的时候都使用Socket命名他们的类的可能性有多大?我猜是接近100%。

命名空间的名字最好是方便输入的,就是说命名空间的名字最好别太长了,2-4个字符就可以了。抱着这样的想法,那两个公司把他们的命名空间叫做net的机会又是多大呢?5%还是10%?

不难看出,命名空间并没有解决所有问题,它只是使发生命名冲突的机会相对小了而已。

有一种叫做“工业化长度”的方法(Industrial Strength Solution),这种方法在命名namespace的时候使用长的唯一的名称,而在程序里使用短的别名。如此network库就可能会是这个样子:

1.namespace net_33843894 {

2.class Socket {

3....

4.};

5.}

net_后面的数字是由一个随机数产生器产生的。为了以后描述方便,这里我们假定上面的代码是放在头文件里。

用户使用我们的库的时候,就要编写他自己的头文件,包含下面的内容:

1.#include < netlib >

2.namespace net = net_33843894;

他创建了一个在本工程内有效的别名,用来代表提供给他的库中的命名空间。如果名称net已经被别的库使用了,那么他还可以另选一个名字代替,例如:net2,sock,或者别的什么。

这样就万事大吉了么?还没有。你还要做一件事:使你的库用起来更简单、更方便。在这个讲究完美的社会里,人们双击一个安装文件后,你的库在他们的开发环境里就应该是可用的,接下来就是#include ,再接下来他们就可以去忙别的了。

然而,现在的情况是,用户为了使用你的库需要创建一个他自己的头文件,虽然这并没有什么大不了的,但不是每个用户都能忍受这一点。解决的方法就是直接提供一个合理的缺省值,如果用户觉得不合适也可以取消,所以,在你的头文件里使用预编译选项,如下:

01.namespace net_33843894 {

02.class Socket {

03....

04.};

05.}

06.

07.#ifndef NO_NET_33843894_ALIAS

08.namespace net = net_33843894;

09.#endif

这样我们就给命名空间的名字提供了一个缺省值,如果这个名字已经有人用了,那么用户可以定义一个NO_NET_33843894_ALIAS宏,别名就会被取消。

不幸的是,即使是使用了短的别名net,当你使用Socket类的方法不对的时候,在我所用过的编译器中,没有一个能够在错误提示信息里显示的短的别名,而是仍然使用net_33843894::Socket。读起来有些费劲。

怎么办?看我的。

01.#ifdef NO_NET_33843894_ALIAS

02.namespace net_33843894 {

03.#else

04.namespace net {

05.#endif

06.class Socket {

07....

08.};

09.}

10.

11.#ifndef NO_NET_33843894_ALIAS

12.namespace net_33843894 = net;

13.#endif

如果没有定义宏NO_NET_33843894_ALIAS, 就直接给命名空间起个短一点的名字,把别名弄长点就可以了。这样,错误信息读起来就会顺眼多了。

Use Namesapce 使用方法简介相关推荐

  1. 【机器学习入门到精通系列】蒙特卡罗方法简介和代码演示

    文章目录 1 蒙特卡罗方法简介 2 求圆周率pi的近似值 3 求定积分的近似值 1 蒙特卡罗方法简介 蒙特卡罗(Monte Carlo)方法:简单来说,蒙特卡洛的基本原理简单描述是先大量模拟,然后计算 ...

  2. 【Groovy】编译时元编程 ( ASTTransformation#visit 方法简介 | org.codehaus.groovy.ast.ModuleNode 脚本节点 )

    文章目录 一.ASTTransformation#visit 方法简介 二.org.codehaus.groovy.ast.ModuleNode 脚本节点 一.ASTTransformation#vi ...

  3. 【Android 异步操作】AsyncTask 异步任务 ( 参数简介 | 方法简介 | 使用方法 | AsyncTask 源码分析 )

    文章目录 一.AsyncTask 参数简介 二.AsyncTask 方法简介 三.AsyncTask 基本用法 四.AsyncTask 构造函数源码解析 五.AsyncTask 构造函数相关源码注释 ...

  4. UA PHYS515A 电磁理论III 静磁学问题2 标量势方法与向量势方法简介

    UA PHYS515A 电磁理论III 静磁学问题2 标量势方法与向量势方法简介 标量势方法 向量势方法 Hard Ferromagnets 标量势方法 当空间中不存在电流密度时(J⃗=0\vec J ...

  5. 微信门店小程序怎样创建 门店小程序创建方法简介

    微信门店小程序怎样创建 门店小程序创建方法简介 微信门店小程序是什么东西?门店小程序要怎样创建?还不清楚微信门店小程序详情的小伙伴们抓紧时间跟上小编一起来看一下吧!     门店小程序是什么? 微信发 ...

  6. ML之相似度计算:图像数据、字符串数据等计算相似度常用的十种方法简介、代码实现

    ML之相似度计算:图像数据.字符串数据等计算相似度常用的十种方法简介.代码实现 目录 相似度 1.余弦相似性-夹角余弦(Cosine_Distance)距离 2.代码实现-余弦距离.余弦相似度 2.皮 ...

  7. Redis Cluster搭建方法简介22211111

    Redis Cluster搭建方法简介 (2013-05-29 17:08:57) 转载▼ Redis Cluster即Redis的分布式版本,将是Redis继支持Lua脚本之后的又一重磅功能,官方声 ...

  8. html5 filereader读取文件,H5的FileReader分布读取文件应该如何使用以及其方法简介...

    这次给大家带来H5的FileReader分布读取文件应该如何使用以及其方法简介,H5的FileReader分布读取文件的使用以及其方法简介的注意事项有哪些,下面就是实战案例,一起来看一下. 先介绍一下 ...

  9. TabBarController创建及使用方法简介

    TabBarController创建及使用方法简介 大致讲解一下TabBarController的创建过程: 首先,我们需要一些视图,如创建UIControllerView类型的view1,view2 ...

最新文章

  1. 剑指offer 合并2个排序的链表
  2. udp协议服务器客户端流程图,UDP 协议通信服务器端客户端.doc
  3. SEO 搜索引擎优化技巧
  4. [IT幽默]不上网与上网女人区别
  5. 航空信息指挥调度系统_应急指挥中心指挥调度系统解决方案(一)
  6. C++学习日记#3——追赶法求解系数矩阵为对角占优的三对角线方程组
  7. 安卓性能优化全面总结(友盟性能优化大赛获奖作品)
  8. Excel快捷键大全和35个函数---第二弹
  9. 怎么分割视频,将视频自定义分割成多个小片段的方法
  10. raptor流程图赋值语句_RAPTOR和流程图.ppt
  11. uni-app以h5网页的方式发布企业微信应用
  12. 富途客户端软件测试笔试and面试
  13. 蚂蚁金服区块链+公益又有新动作,助力相互保险爱心救助账户
  14. 微信小程序,图片双指放大缩小
  15. 365天挑战LeetCode1000题——Day 116 第315场周赛 「中国银联 力扣」
  16. 软件工程毕业设计课题(63)微信小程序毕业设计JAVA校园新生报到小程序系统设计与实现
  17. Apipost Apifox 真实体验,到底哪个更好用?
  18. 股票市场中有哪些是一般散户想不到但实际却很重要的知识?
  19. python动态捕捉屏幕_如何使用Python实现自动化截取Windows系统屏幕
  20. PPP原理 PAP认证 CHAP认证

热门文章

  1. db2中TRANSLATE函数可以实现简单的正则(不属于真正的正则表达式)
  2. $(cd $(dirname $0),pwd) 解析
  3. Python(一)缺点
  4. ruby Enumerator::lazy
  5. Java - HashSet源码解析
  6. 《算法导论》(CLRS)第三版 第3章总结
  7. 微软ASP.NET站点部署指南(11):部署SQL Server数据库更新
  8. sparksql与hql语法差异
  9. CentOS7下安装达梦数据库的步骤
  10. Linux之route命令