这个namespace是干啥的呢?这个词的中文意思就是命名空间,它主要是提供了一个域,这个域中出现的名字不与其他域中的名字产生冲突。
一个域中的名称可以被外界引用这说明这些名字具有外部连接属性,当然常量默认情况下还是仅具有内部连接属性的,为什么呢?那就要看这里了。
你可以在程序中引入既有命名空间中的名字,只要使用using声明即可,比如下图所示:
引入一次即可,然后你就可以直接使用了。如果使用域中存在同名变量,那么会出现错误,因为编译器会认为这是对该namespace中的同名变量进行二次声明或定义,会犯多重定义的错误。如下图所示:
所以说using指令是一个声明式,在某个域中它是唯一的。
而你单纯地使用域操作符是另外一回事,你使用域操作符只不过是使用namespace中的成员而已,但是它的优先级没有本地变量高,如果有本地同名变量,namespace中的变量会被屏蔽。如下图所示:
所以如果你确实想使用namespace中的成员,那你用using可以确保你就是使用它。
另外一个就是使用using
namespace指令,后面加上你要引用的命名空间的名称,它使得该命名空间的所有名称都可见。如果你把这个指令放在了全局域中,那么它就到处都可见了。比如下图所示:
这里有几点需要注意的。1、如果在同级域中已经存在了一个本地name,那你就不能再使用using来引进这个name了。如果你确实这么做了,本地name会屏蔽namespace中的name。
不过经过验证似乎现在的VS中的namespace只能在内部进行声明,而不能在外部。在外部只能是引用该namespace中的成员而已。
2、当你在一个同级域中,通过using namespace引入一个命名空间,并且这个命名空间中的名称和本地变量名称一样时,该namespace中的名称会被屏蔽,除非你加限定符明确指出来。
在这里全局域直接用域操作符来分辨,下面看个例子。
一般来说,全局性地使用using
namespace xxx;会使该namespace中的成员遍布整个程序,这样你都搞不清楚哪些是你添加进去的。所以推荐的使用方式是在特定的作用域中使用using
namespace指令,或者使用命名空间名称+域操作符来引用命名空间成员。这个限制是C++ Primer Plus中所说的。
不过,我个人认为,现在的C++不允许你在namespace之外声明新的name,因此你不可能在外面引入新的name,而不让你随便使用全局性质的namespace的原因可能是怕你分不清哪些是该namespace中的名字吧。而如果某些系统不支持命名空间的话,你可以完全只使用头文件。
Namespace是可以嵌套的。
你可以给namespace起个别名,方便使用和记忆,方法如下:
无名namespace。这种命名空间只能现声明现用,它往往局限于某个作用域中之内。因为没名所以你不能显式引用它的成员,也不具有外部连接属性,它相当于文件域中的static变量。它是作为本文件中static变量的替代方案而存在的。