意義
對于一個較大型的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;
}```