意义
对于一个较大型的C++程序来说,需要由多个程序员相互协作编写,这样的情况下容易出现不同程序员在需要负责的程序部分使用相同名字的变量或函数,导致程序合并后出现问题。名字空间的作用,就是将不同程序员编译的程序放入相应的名字空间,每个名字空间相对独立,空间内的变量和函数名只局限于当前空间下,从而解决命名冲突的问题。
格式
namespace 空间名 {程序块}
使用
1. 自定义名字空间
/*zhang.h*/ //原编译文件
#ifndef ZHANGH
#define ZHANGH
namespace Zhang{
void f();
class T{
void ZhangFunc();
};
}
#endif
/*zhang.cpp*/ //使用名字空间中的变量和函数
void Zhang::f(){} //使用Zhang中的f()
void Zhang::g(){}
void Zhang::T::ZhangFunc() //使用Zhang中的类T中的ZhangFunc()
{
} ```
include <iostream>
using namespace std;
namespace my{
int abc = 100;
class T{
...
};
}
namespace my{
void myFunc(){
cout<<"Show string!"<<endl;
}
} //实际上上面两个my名字空间为同一个my,分开写减少代码长度
int main(){
my::myFunc();
cout<<my::abc<<endl; //调用的是同一个my
return 0;
}```
2. 匿名名字空间
不命名,即namespace后不加空间名,此时在文件中只可通过特殊的地址传递方式访问其中的内容,每次编译C++自动赋予其名字,故实际上只能编译该空间一次,其具体作用后续再介绍。
3. 全局名字空间
在主文件中用到的名字空间,作用域为整个当前cpp文件,格式为
using namespace 空间名
典型案列:
using namespace std
std 即为包含输入输出流的全局名字空间(任何空间都可作为全局名字空间使用)
使用std名字空间的程序例子如下
#include<iostream>
using namespace std;
int abc = 100;
void myFunc(){
cout<<"Show string!"<<endl;
}
int main(){
::myFunc(); myFunc(); //两句意思相同
::cout<<::abc<<abc<<endl; //::cout,::abc即是cout,abc
return 0;
}```
使用其他名字空间的例子如下
include <iostream>
using namespace std;
namspace first
{
int x = 5;
}
namspace second
{
double x =3.1416;
}
int main(){
{ //编译时不同的名字空间为限定其作用范围应该加入大括号
using namespace first;
cout<<x<<endl;
}
{
using namespace second;
cout <<x<<endl;
}
//如果不加入大括号则实际代码如下
using first::x;
cout<<x<<endl;
using second::x; //此处x与之前的x冲突,编译器无法识别,报错
cout<<x<<endl;
//
return 0;
}```