一.诞生及定义
- 为防止命名冲突,C++的机制可以由程序员建立一些相互分隔的作用域,将一些全局实体分隔开。
- 命名空间定义:由程序设计者命名的内存区域,程序员可以根据需要指定一些有名字的空间域,把一些全局实体分别放在各个命名空间中,与其他全局实体分开。
- 在自定义命名空间中可包含:常量,变量(可带初始化),函数(可以定义或声明),结构体,类,模板和其他命名空间。
二.用法
- 创立命名空间——namespace+名字
namespace A
{
int x=1;
void fun()
{
cout<<"x=1"<<endl;
}
}
- 使用命名空间中内容,命名空间名::命名空间成员名
A::fun();
- 若想使用一个语句就可一次声明一个命名空间中全部成员,即使成员不添加命名空间::编译器也可直接判定是哪个元素
- using namespace +命名空间名
-
#include<iostream> using namespace std; namespace A { int x=1; void fun() { cout<<"x=1"<<endl; } } namespace B { int x=2; void fun() { cout<<"x=2"<<endl; } void fun2() { cout<<"fun2()"<<endl; } } int main() { using namespace B; A::fun(); B::fun(); fun2(); return 0; }
上述代码中由于已经声明命名空间,fun2()也可不用加B::,但为防止出现错误,只有在使用命名空间数量很少以及确保这些命名空间中没有同名成员时才使用using namespace语句
三.有关于using namespace std;
- 标准C++库的所有标准头文件中函数,类,对象,类模板都是在命名空间std中定义的。
- 为了方便,无需在所有类似于cout之类标识符前添加"std::",每个C++程序开头均添加using namespace std;语句,也可使std中所有声明与定义当做全局变量使用。
四.无名命名空间
- 由于命名空间无名,则无法在其他文件中引用,只在本文件作用域有效。
- 文件中也无需使用命名空间名限定
-
namespace { void fun() { cout<<"12345"<<endl; } }
可在main函数中直接调用fun()。