C++語言引入命名空間(Namespace)這一律念主要是爲了不命名衝突,其關鍵字爲 namespace。
科技發展到現在,一個系統一般都不會僅由一我的來開發完成,不一樣的人開發同一個系統,不可避免地會出現變量或函數的命名衝突,當全部人的代碼測試經過,沒有問題時,將全部人的代碼結合到一塊兒,由於變量或函數重名而致使的問題將會形成必定的混亂,例如:
ios
int flag = 1; //小李聲明的變量 // …… //中間間隔若干行代碼 bool flag = true; //小韓聲明的變量
注意:此例僅爲解釋命名空間所用,在公司的系統開發中並不是如此中所述,徹底僅靠命名空間來解決命名衝突的,具體編程規範能夠參考林銳的《高質量程序設計指南》一書。
如上所示,由於我的習慣不一樣,小李喜歡聲明int型變量用於邏輯判斷,而小韓則更喜歡採用bool類型變量。但兩個聲明放到同一個函數中的時候,很明顯編譯器會提示出flag變量從新定義的錯誤。這種問題若不加以處理是沒法編譯經過的。
可使用命名空間解決相似上面的命名衝突問題,例如:
編程
namespace Li{ //小李的變量聲明 int flag = 1; } namespace Han{ //小韓的變量聲明 bool flag = true; }
小李與小韓各自定義了以本身姓氏爲名的命名空間,此時將小李與小韓的flag變量定義再置於同一個函數體中,則不會有任何問題,固然在使用這兩個變量的時候須要指明所採用的是哪個命名空間中的flag變量。
指定所使用的變量時須要用到「::」操做符,「::」操做符是域解析操做符。例如:
函數
Li::flag = 0; //使用小李定義的變量flag Han::flag = false; //使用小韓定義的變量flag
咱們已經定義了兩個命名空間 Li 和 Han,並在其中各自聲明flag變量,使用的時候則須要分別用域解析操做符指明此時用的flag變量是誰定義出來的flag變量,是小韓仍是小李定義的。
除了直接使用域解析操做符,還能夠採用using聲明(using declaration),例如:
測試
using Li::flag; flag = 0; //使用小李定義的變量flag Han::flag = false; //使用小韓定義的變量flag
在代碼的開頭用using聲明瞭Li::flag,其含義是using聲明之後的程序中若是出現未指明的flag時,則使用Li::flag,可是若要使用小韓定義的flag,則仍須要Han::flag。
using聲明不只僅能夠針對命名空間中的一個變量,也能夠用於聲明整個命名空間,例如:
spa
using namespace Li; flag = 0; //使用小李定義的變量flag Han::flag = false; //使用小韓定義的變量flag
若是命名空間Li中還定義了其餘的變量,則一樣具備flag變量的效果,在using聲明後,若出現未具體指定命名空間的命名衝突變量,則默認採用Li命名空間中的變量。
命名空間內部不只能夠聲明或定義變量,對於其它能在命名空間之外聲明或定義的實體,一樣也都能在命名空間內部進行聲明或定義,例如變量的聲明或定義、函數的聲明或定義、typedef等均可以出如今命名空間中。
下面咱們來看一個簡單的C++程序的示例:設計
#include<iostream> using namespace std; int main(){ cout<<"hello world!"<<endl; return 0; }
這是一個簡單的C++程序hello world示例,在程序中採用了using聲明命名空間std,using namespace std; 這一語句涵蓋了std命名空間中的全部標識符,而該命名空間包含C++全部標準庫。頭文件iostream文件中定義的全部變量、函數等都位於std命名空間中,每次使用iostream中的變量或函數都須要在前面加上std::是很是麻煩的一件事,爲此可直接用using聲明將std中的全部變量或函數等都聲明出來。
若是不用using namespace std;這一語句,則程序應該像下面這樣:
code
#include<iostream> int main(){ std::cout<<"hello world!"<<std::endl; return 0; }
這樣看起來是至關麻煩的,若是在某次使用iostream中變量或函數時漏掉std則會致使爲定義標識符錯誤。
C++語言是以C語言爲基礎的,它繼承了全部的C語言函數庫,但C++對這些標準庫都從新命名了。標準C頭文件(如math.h)重命名爲cmath,去掉頭文件的.h,並在前面加上c。所以在C++中如需使用math.h頭文件則能夠按照以下方式使用。blog
#include<cmath> using namespace std;
如下的 是個人簡單的工程代碼繼承
namespace 頭文件的代碼ip
#ifndef NAMESPACE_H #define NAMESPACE_H namespace Li{ //小李的變量聲明 int flag = 1; } namespace Han{ //小韓的變量聲明 bool flag = true; } #endif // NAMESPACE_H
主函數的代碼
#include <iostream> #include "namespace.h" using namespace std; using namespace Li; int main(int argc, char *argv[]) { cout << Li::flag << endl; Li::flag = 9; cout << Li::flag << endl; return 0; }
輸出的結果是