C++命名空間
考慮這樣一種情況,當我們使用相同的名稱,叫Zara的兩個人在同一個班級。我們需要明確區分它們將不得不使用一些額外的信息,如他們的名字,如他們生活在不同的區域或母親或父親的名字等等。
同樣的情況也出現在C++應用程序中。例如,可能會有一些代碼,有一個函數調用xyz()函數,而且這也有同樣的功能另一個某某庫也有提供。現在,編譯器冇有辦法知道xyz()函數指的是代碼中的哪一個版本。
命名空間被設計為克服這一困難,並作為附加信息來區分類似函數,類,變量等具有相同名稱的不同的庫可用。使用命名空間可以定義在名稱定義的上下文。在本質上,一個命名空間中定義了一個範圍。
定義命名空間:
命名空間的定義使用命名空間關鍵字後麵的命名空間名稱如下開始:
namespace namespace_name { // code declarations }
調用任何函數或變量的命名空間啟用版本,前麵加上命名空間名稱如下:
name::code; // code could be variable or function.
讓我們來看看如何命名空間範圍的實體,包括變量和函數:
#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; }
如果我們編譯並運行上麵的代碼,這會產生以下結果:
Inside first_space Inside second_space
using指令:
也可避免命名空間使用using namespace指令前綴。這個指令告訴後續代碼利用名指定的命名空間中的編譯器。因此,命名空間隱含了下麵的代碼:
#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; }
如果我們編譯並運行上麵的代碼,這會產生以下結果:
Inside first_space
using指令也可以被用來指特定的項目名稱空間內。例如,如果打算使用std命名空間,唯一部分是cout,如下所示:
using std::cout;
隨後的代碼可以參考cout冇有預先考慮命名空間,但在std命名空間的其他項目仍然需要按如下方式:
#include <iostream> using std::cout; int main () { cout << "std::endl is used with std!" << std::endl; return 0; }
如果我們編譯並運行上麵的代碼,這會產生以下結果:
std::endl is used with std!
使用指令引入的名稱遵循正常的範圍規則。這個名字是從using指令在該指令中範圍的結束點內可見。實體與外部範圍定義的同名是隱藏的。
不連續的命名空間:
命名空間可以在幾個部分來定義,因此命名空間是由它單獨定義的部分的總和。一個命名空間的分開的部件可以分散在多個文件中。
所以,如果命名空間中的一個組成部分,需要在另一文件中定義的名稱,名稱仍然必須聲明。編寫以下命名空間的定義或者定義了一個新的命名空間或增加了新的元素,以現有的:
namespace namespace_name { // code declarations }
嵌套的命名空間:
命名空間可以嵌套,可以定義一個命名空間在另一個名字空間中,如下所示:
namespace namespace_name1 { // code declarations namespace namespace_name2 { // code declarations } }
可以通過使用運算符解決如下訪問嵌套的命名空間的成員:
// to access members of namespace_name2 using namespace namespace_name1::namespace_name2; // to access members of namespace:name1 using namespace namespace_name1;
在上麵的語句,如果使用的是namespace_name1,那麼它有如下namespace_name2的元素範圍可供選擇:
#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; }
如果我們編譯並運行上麵的代碼,這會產生以下結果:
Inside second_space