1.前言
namespace中文意思是命名空間或者叫名字空間,傳統的C++只有一個全域的namespace,但是由於現在的程式的規模越來越大,程式的分工越來越細,全域範圍變得越來越擁擠,每個人都可能使用相同的名字來實現不同的庫,於是程式員在合并程式的時候就會可能出現名字的衝突。
namespace引入了複雜性,解決了這個問題。namespace允許像類,對象,函數聚集在一個名字下。
本質上講namespace是對全域範圍的細分。
一個典型執行個體:
#include <iostream>using namespace std;int main(){ printf("hello world !"); return 0;}這可能是我們最先接觸namespace的代碼。然而,namespace的功能不止如此。 namespace的格式基本格式是:
namespace identifier{ entities;}例如:
namespace exp{ int a,b;}有點類似於類,但完全是兩種不同的類型。
為了在namespace外使用namespace內的變數我們使用::操作符,如exp::a、exp::b。使用namespace可以有效避免重定義的問題。
2.避免重定義問題
#include <iostream>using namespace std;namespace first{ int var = 5;}namespace second{ double var = 3.1416;}int main () { cout << first::var << endl; cout << second::var << endl; return 0;}結果是:5 3.1416。兩個全域變數名字都是var,但是他們不在同一個namespace中所以沒有衝突。 從這裡我們也能看出來,namespace最大的作用在於,可以很好地解決重複定義問題。
2.1 using可以匯入整個的namespace
#include <iostream>using namespace std;namespace first{ int x = 5; int y = 10;}namespace second{ double x = 3.1416; double y = 2.7183;}int main () { using namespace first; cout << x << endl; cout << y << endl; cout << second::x << endl; cout << second::y << endl; return 0;}輸出是:5,10,3.1416,2.7183; 正如我們所預見的匯入的整個的first的namespace,前一對x,y的值就是first中的x,y的值。
這裡我們不能在“using namespace first;“下加一句“using namespace second;“,為什麼呢。
這樣做無異於直接完全的忽視namespace first和namespace second,會出現重複定義的結果,所以前面的hello_world.c中的using指令的使用一定程度上存在問題的,只是因為我們就用了一個namspace,一旦引入了新的namespace這種做法很可能會出現重複定義的問題。
2.2 支援顯示的限定方法 在標頭檔中,我們通常堅持使用
顯式的限定,並且僅將using指令局限在很小的範圍中,這樣他們的效用就會受到限制並且便於使用。類似的例子:
#include <iostream>using namespace std;namespace first{ int x = 5;}namespace second{ double x = 3.1416;}int main () { { using namespace first; cout << x << endl; } { using namespace second; cout << x << endl; } return 0;}輸出是:5,3.1416;可以看到
兩個不同的namespace都被限制在了不同範圍{}中了,這就沒有衝突。
3.參考資料 [1]《C++必知必會》 [美]Stephen C.Dewhurst 著,榮耀譯
[2] http://www.cplusplus.com/doc/tutorial/namespaces.html
[3]《C++精粹》 [美]Ira Pohl 著 王樹武 陳朔鷹 等譯