命名空间namespace之工程实践篇

原创 2003年05月23日 11:41:00

来自:www.codeproject.com

标题: Using Namespaces Properly

作者: Dejan Jelovic

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

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

使用namespace的正确方法

 

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

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

 

namespace net {

    class Socket {

        ...

    };

}

...

net::Socket socket;

 

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

 

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

 

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

 

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

 

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

 

namespace net_33843894 {

    class Socket {

        ...

    };

}

 

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

 

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

#include <netlib>

namespace net = net_33843894;

 

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

 

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

 

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

 

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_ALIAS

namespace net_33843894 {

#else

namespace net {

#endif

    class Socket {

        ...

    };

}

 

#ifndef NO_NET_33843894_ALIAS

    namespace net_33843894 = net;

#endif

 

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

操作系统虚拟化底层基础之命名空间(namespace)

操作系统虚拟化底层基础之命名空间(namespace)   黎润(yijunzhu@qq.com)    (sina不支持自动word转化,请感兴趣同学从链接下载虚拟化之命名空间)   背...
  • tycoon1988
  • tycoon1988
  • 2014年08月04日 16:02
  • 1005

namespace命名空间-之使用

文章下载地址    http://download.csdn.net/detail/shichaog/8185583 由于各种原因,用户空间命名空间的实现算是一个里程碑了,首先是历时五年最复杂命名空...
  • xuguokun1986
  • xuguokun1986
  • 2017年05月31日 21:12
  • 735

PHP5.3中的命名空间(namespace)及其使用详解

php自5.3.0开始,引入了一个namespace关键字以及__NAMESPACE__魔术常量(当然use关键字或use as嵌套语句也同时引入);那么什么是命名空间呢?php官网已很明确的进行了定...
  • forest_fire
  • forest_fire
  • 2016年03月21日 11:17
  • 1404

C++ 命名空间 namespace 知多少

A. 命名空间是什么      命名空间是一个作用域,为了防止命名冲突。不同命名空间内可以有相同名字的成员。 在所有命名空间之外,有一个全局命名空间,以隐式方式声明,这个命名空间并没有名字。 B....
  • u013575812
  • u013575812
  • 2016年04月15日 22:46
  • 955

kubenetes学习3--Namespace命名空间

Namespace(命名空间)是kubernetes系统中的另一个重要的概念,通过将系统内部的对象“分配”到不同的Namespace中,形成逻辑上分组的不同项目、小组或用户组,便于不同的分组在共享使用...
  • dream_broken
  • dream_broken
  • 2016年11月11日 15:01
  • 7634

C++库研究笔记——命名空间namespace 嵌套后的作用域问题

总结: 1.::ant 表根命名空间,或匿名空间 2.同时存在 ::ant::i 和::ant::blas::i,  ant::detail::i时,在::ant::detail中使用i时,默认调...
  • mathgeophysics
  • mathgeophysics
  • 2013年08月03日 13:45
  • 5267

PHP命名空间 namespace 及导入 use 的用法

在PHP中,出现同名函数或是同名类是不被允许的。为防止编程人员在项目中定义的类名或函数名出现重复冲突,在PHP5.3中引入了命名空间这一概念。1.命名空间,即将代码划分成不同空间,不同空间的类名相互独...
  • JathamJ
  • JathamJ
  • 2016年11月09日 17:58
  • 8577

namespace packages 命名空间包 学习总结

在3.3及以后的Python版本中,加入了新的模型:命名空间包。 其特性如下: 1.优先级最低,在已有版本所有的import规则之后; 2.要导入的文件夹中不能有__init__.py文件 3.主要依...
  • tinyeyeser
  • tinyeyeser
  • 2014年03月04日 15:59
  • 1362

namespace 命名空间——多个的相互联系及自动合并;协作开发

#include using namespace std; namespace Space { int x; } namespace Space//可以看出与上方重名了 { i...
  • blank__box
  • blank__box
  • 2016年11月07日 19:21
  • 378

AS3中命名空间使用要点

最近利用命名空间来优化框架接口的可见性,当命名空间应用于setter和getter方法时,有点问题。 public function get data():Object { return _data...
  • mon6912640
  • mon6912640
  • 2014年01月04日 23:57
  • 893
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:命名空间namespace之工程实践篇
举报原因:
原因补充:

(最多只允许输入30个字)