摘自C++ Primer
引入原因
当应用程序用到多个供应商提供的库时,不可避免地会发生某些名字相互冲突的情况。多个库将名字放置在全局命名空间中将引发命名空间污染。
命名空间定义
为防止名字冲突提供了更加可控的机制。命名空间分割了全局命名空间,其中每个命名空间是一个作用域。
使用规则
只要是出现在全局作用域中的声明,都可以在命名空间中定义,例如:类、变量(初始化及其操作)、函数(及其定义)、模板、定义子命名空间。
namespace ($name){
class a{/…/};
int a_;
a a_1;
}
命名空间中的名字必须在定义它的作用域内保持唯一。以类为例,如果在某个命名空间中定义了class a, 那么在该命名空间中便不能再定义变量a或模板a
命名空间可以是不连续的。例如在一个命名空间需要定义多个类,又由于单个类的定义可以放在单个.h文件中,那么当一个类已经定义在该命名空间之后,下一个类的定义可以继续扩充该命名空间:例如test_1.h和test_2.h
namespace test{
class test_1{
/*
*/
};
}
namespace test{
class test_2{
/*
*/
};
}
未命名的命名空间
用namespace后紧跟花括号括起来的一系列声明语句。
1.未命名的命名空间中定义的变量拥有静态生命周期:在第一次使用前创建,并且直到程序结束才销毁
这意味这在一个文件中定义好了未命名的命名空间后,该命名空间中定义的所有对象仅在该命名空间中有效,其作用范围无法跨越多个文件。个人理解为因为是未命名,所以在using时无法指定未命名空间中的对象,所以这些对象的作用域仅限于其定义的文件。
2.C++11中取消了在文件中声明static的全局实体,现在利用未命名的命名空间来实现静态的全局变量