使用namespace的正确方法

2016-01-29 12:20 4 1 收藏

使用namespace的正确方法,使用namespace的正确方法

【 tulaoshi.com - C语言心得技巧 】

使用namespace的正确方法
原作:Dejan Jelovic 翻译:zhigang

[译者注]受本人翻译水平限制,可能原文作者的本意并没有被完全准确的表达出来,如果你在阅读本文的过程中出现问题,你可以给我写信coolgrass@sina.com
来自:www.codeproject.com
标题: Using Namespaces Properly

命名空间(namespace)在C++中的作用非同一般。本文目的不在于阐述命名空间的语法,而在于演示命名空间的使用方法,或者说是使用命名空间的小窍门。
命名空间可以简单的将一些命名(name)用另一个命名打包封装起来。比方说:

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

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

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

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

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com)

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

namespace net_33843894 {    class Socket {        ...    };}
net_后面的数字是由一个随机数产生器产生的。为了以后描述方便,这里我们假定上面的代码是放在<netlib头文件里。
用户使用我们的库的时候,就要编写他自己的头文件<mynetlib,包含下面的内容:
#include <netlib>namespace net = net_33843894;
他创建了一个在本工程内有效的别名,用来代表提供给他的库中的命名空间。如果名称net已经被别的库使用了,那么他还可以另选一个名字代替,例如:net2,sock,或者别的什么。

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

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com)

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

namespace net_33843894 {    class Socket {        ...    };}#ifndef NO_NET_33843894_ALIAS    namespace net = net_33843894;#endif
这样我们就给命名空间的名字提供了一个缺省值,如果这个名字已经有人用了,那么用户可以定义一个NO_NET_33843894_ALIAS宏,别名就会被取消。

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

怎么办?看我的。

#ifdef NO_NET_33843894_ALIASnamespace net_33843894 {#elsenamespace net {#endif    class Socket {        ...    };}#ifndef NO_NET_33843894_ALIAS    namespace net_33843894 = net;#endif
如果没有定义宏NO_NET_33843894_ALIAS, 就直接给命名空间起个短一点的名字,把别名弄长点就可以了。这样,错误信息读起来就会顺眼多了。


来源:http://www.tulaoshi.com/n/20160129/1485671.html

延伸阅读
     我们要使用ADO.NET 中的对象,必需先宣告ADO.NET 的名称地址(Namespace)。因为微软为.NET 做了数量相当可观的类别对象,所以宣告名称地址是必要的。名称地址中记录了对象的名称以及所在,这样编译器在编译我们程序的时候才知道这些对象要到哪里去加载,和VB 6的设定Reference 很类似。 &nb...
早晚使用不同牙膏 在欧美先进国家,有80%以上的人会在早晚分别使用功能不同的牙膏,从而更好地保护牙齿。对于这个做法,中华口腔医学会牙周病学组委员、日本齿学博士毕良佳教授也非常赞成。 大部分口腔问题是由细菌引起的,人体口腔分泌的唾液具有杀菌功能。在白天,唾液分泌量是晚上的3—4倍,容易抑制细菌产生,且白天进食多,口腔...
标签: 生活常识
使用保鲜膜的正确方法   目前市场上出售的保鲜膜从原材料上主要分为三大类:第一类是聚乙烯(PE或LDPE) ,主要用于普通水果蔬菜等的包装;第二类是聚偏二氯乙烯(PVDC),主要用于一些熟食、火腿等产品的包装;第三类是聚氯乙烯(PVC),也可以用于食品包装,但它对人体的健康有一定的影响。 如何选购保鲜膜 北京凯发环保技...
标签: 睡眠面膜
自制面膜对肌肤的伤害很大,原因是这些天然的成分没有经过科技的浓缩细化处理,让皮肤很难吸收如此大分子的营养,另外像柠檬这些具有强烈果酸的成分会强烈刺激到皮肤,敷这样的面膜是起不到美容效果的。 面膜增白-正确使用面膜的方法 敏感肌敷面膜要先测试 敏感肌肤的美眉敷面膜前一定要先将面膜在耳背测试,如无过敏等...
标签: 电脑入门
1、电脑主机要放置在平稳可靠的地方,千万不要放在摇晃的桌面上。 2、安装硬盘要牢固可靠,在长期使用过程中难免会发生螺丝松动的情况,一旦有松动便增加了不稳定因素,因此一定要上紧螺丝。有人认为只要上三颗 螺丝就行了,理由是三点决定一个平面,甚至有人只上两颗或一颗螺丝,理由是只要不让硬盘滑出来就行了,前一种观点尚存争论,后一种...

经验教程

403

收藏

21
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部