namespace 是C++的一个关键字 。实际上,它只是起到标识作用,把全局的变量,函数,类等放到一起,细化管理。
并且namespace还可以嵌套定义。
#include<iostream>
#include <stdio.h>
using namespace std;
namespace HelloWorld
{
namespace Hello
{
void foo(){ cout<<"Hello"; }
}
void fooo(){ Hello::foo(); cout<<" World!"<<endl; }
}
//using namespace HelloWorld;
//void cout()
//{
// printf("%s\n","Right");
//}
void fooo()
{
cout << "Can be Override" << endl;
}
void main()
{
fooo();
//cout();
}
上面的一段代码,如果不使用名字空间std,则找不到cout、cin、endl等标识符,因为这些标识符都是在命名空间std中定义的。使用using打开命名空间,是这个空间中的标识符在当前文件中可见。只有打开这个空间并且包含头文件iostream才可以使用cout等标识符。
为了验证,定义了命名空间HelloWorld,并嵌套定义了明明空间Hello。如果只是定义了HelloWorld而没有打开命名空间,则可以自己定义fooo函数,并可以在main函数中成功调用。如果打开了命名空间HelloWorld,则编译时候会报错,因为此时命名空间内部的fooo函数在这个文件中是可见的,如果又自定义一个fooo函数的话,就会造成名字的冲突,从而导致编译报错。
并且,如果没有打开命名空间std,即使包含了头文件iostream,还是可以自定义函数cout,也不会造成名字冲突。说明cout标识符存在于std空间中。在iostream中只是包含了cout的实现,而并没有包含cout标识符的定义(推测)。
此外命名空间中还可以包含类、变量等成员。
感觉命名空间的好处就在于,把标识符归类,在不同的命名空间中的标识符可以使同名的。如果不使用某一个命名空间的话,在写代码的时候就可以使用这个命名空间中某个标识符的名字进行程序标识符的命名。因为很多情况下回造成重名现象。使用命名空间就可以把不用的一些舍弃。C++标准程序库中的所有标识符都被定义于一个名为std的namespace中。