c++ 命名空間(Namespace)std

當你採用不同的模塊和/或程序庫時,經常會出現名稱衝突現象,這是因爲不同的模塊和程序庫可能對不同的對象使用相同的標識符(identifier)。Namespace正是用來解決這個問題的。所謂 namespace是指標識符的某種可見範圍。和class不同,namespace具有擴展開放性,可發生於任何源碼文件上。因此你可以使用一個namespace來定義若干組件,而它們可散佈於多個實質模塊(physical module)內。這類組件的典型例子就是C++標準庫,因爲C++標準庫使用了一個namespace。
事實上,C++標準庫中的所有標識符都被定義於一個名爲std的namespace內。C++11還包含由TR1引入、被定義於namespace std::tr1內的所有標識符。此外,namespace posix被保留了,雖然它尚未被C++標準庫使用
注意,以下namespace嵌套於std內,被C++標準庫使用:
·std::rel_ops(見5.5.3節第138頁)std::chrono(見5.7.1節第144頁)
·std::placeholders(見6.10.3節第243頁)
·std::regex_constants(見14.6節第732頁)
·std::this_thread(見18.3.7節第981頁)


基於namespace帶來的概念,欲使用C++標準庫的任何標識符,你有三種選擇:
1.直接指定標識符,例如寫下std::ostream而不是ostream。完整語句類似這樣:
            std::cout << std::hex<<3.4<<std::endl;
2.使用using declaration。例如以下程序片段使我們後續不必寫出範圍限定符std::便可直接使用cout和end1:
using std::cout;

using std::endl;

於是先前的例子可寫成這樣:
            cout<<std::hex<<3.4<<endl;
3.使用using directive,這是最簡便的選擇。如果對namespace std 採用using directive,便可以讓std內的所有標識符都有效(曝光),就好像它們被聲明爲全局符號一樣。因此,寫下
          using namespace std;

之後,就可以直接這樣寫:

          cout <<hex<<3.4<<end1;

但請注意,在複雜的代碼中,這種方式可能導致意外的名稱衝突,更槽的是,由於某些晦澀的重載(overloading)規則甚至導致不一樣的行爲。如果場合不夠明確(例如在頭文件中),應避免使用using directive。

來源:

c++ 標準庫 2nd

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章