考慮一個(gè)情況,在同一個(gè)班有兩個(gè)同名的人,都叫 Zara 。每當(dāng)我們需要區(qū)分他們的時(shí)候,除了它們的名字我們肯定會(huì)使用一些額外的信息,就像如果他們住在不同的區(qū)域或他們的母親或父親的名字,等等。
同樣的情況會(huì)出現(xiàn)在你的 C++ 應(yīng)用程序中。例如,你可能會(huì)編寫一些代碼,有一個(gè)名為 xyz() 的函數(shù),在另一個(gè)庫中也有同樣的函數(shù) xyz() ?,F(xiàn)在編譯器不知道在你的代碼中指定的是哪個(gè)版本的 xyz() 函數(shù)。
namespace就是用來克服這個(gè)困難的,而且作為附加信息來區(qū)分在不同的庫中具有相同名稱的函數(shù),類、變量等。使用命名空間,你可以定義名字已經(jīng)定義的上下文。從本質(zhì)上講,一個(gè)命名空間定義了一個(gè)范圍。
一個(gè)命名空間的定義由關(guān)鍵字 namespace 加它的名稱組成,如下所示:
namespace namespace_name {
// code declarations
}
調(diào)用任何函數(shù)或變量的命名空間啟用版本,前面加上命名空間名字如下:
name::code; // code could be variable or function.
讓我們看看命名空間如何限定實(shí)體(包括變量和函數(shù))使用范圍:
#include <iostream>
using namespace std;
// first name space
namespace first_space{
void func(){
cout << "Inside first_space" << endl;
}
}
// second name space
namespace second_space{
void func(){
cout << "Inside second_space" << endl;
}
}
int main ()
{
// Calls function from first name space.
first_space::func();
// Calls function from second name space.
second_space::func();
return 0;
}
如果我們編譯和運(yùn)行上面的代碼,這將產(chǎn)生以下結(jié)果:
Inside first_space
Inside second_space
你可以通過使用 using namespace 指令來避免在頭部添加命名空間。這個(gè)指令告訴編譯器,隨后代碼要使用指定命名空間中的名稱。因此名稱空間隱含下面的代碼:
#include <iostream>
using namespace std;
// first name space
namespace first_space{
void func(){
cout << "Inside first_space" << endl;
}
}
// second name space
namespace second_space{
void func(){
cout << "Inside second_space" << endl;
}
}
using namespace first_space;
int main ()
{
// This calls function from first name space.
func();
return 0;
}
如果我們編譯和運(yùn)行上面的代碼,這將產(chǎn)生以下結(jié)果:
Inside first_space
using 指令也可以用來指一個(gè)名稱空間中的特定的項(xiàng)目。例如,如果你打算只是用 std 名稱空間的一部分cout,你可以進(jìn)行如下操作:
using std::cout;
后續(xù)的代碼可以調(diào)用 cout 而不用在前面加上命名空間名字,但命名空間中的其他項(xiàng)目仍需要作如下說明:
#include <iostream>
using std::cout;
int main ()
{
cout << "std::endl is used with std!" << std::endl;
return 0;
}
如果我們編譯和運(yùn)行上面的代碼,這將產(chǎn)生以下結(jié)果:
std::endl is used with std!
using 指令引入的名字遵循正常的檢測規(guī)則。這個(gè)名字相對于從 using 指令的指針到范圍的結(jié)束是可見的,并且在這個(gè)范圍中指令可以被找到。定義在外部范圍的有相同名字的實(shí)體是被隱藏的。
一個(gè)命名空間可以被分別定義為若干個(gè)不同部分,因此命名空間是由這些部分的合集組成。這些被分開定義的命名空間可以分散在多個(gè)文件中。一個(gè)命名空間的分離的部分可以分散在多個(gè)文件。
所以,如果命名空間的一部分需要定義在另一個(gè)文件中的名字,仍然必須聲明這個(gè)名字。定義以下命名空間實(shí)現(xiàn)定義一種新的命名空間或添加新的元素到一個(gè)現(xiàn)有的命名空間:
namespace namespace_name {
// code declarations
}
命名空間可以被嵌套,你可以在一個(gè)命名空間內(nèi)定義另一個(gè)命名空間,如下:
namespace namespace_name1 {
// code declarations
namespace namespace_name2 {
// code declarations
}
}
在上面的語句中如果你使用的是 namespace name1 ,那么它將使 namespace name2 的元素在整個(gè)范圍內(nèi)可用,如下:
#include <iostream>
using namespace std;
// first name space
namespace first_space{
void func(){
cout << "Inside first_space" << endl;
}
// second name space
namespace second_space{
void func(){
cout << "Inside second_space" << endl;
}
}
}
using namespace first_space::second_space;
int main ()
{
// This calls function from second name space.
func();
return 0;
}
如果我們編譯和運(yùn)行上面的代碼,這將產(chǎn)生以下結(jié)果:
Inside second_space