現代程式猿們對namespace(命名空間)的使用已經習以為常了,而且現在的編譯器對namespace肯定都有比較好的支援。但是有沒有想過在很遙遠的某個年代,當時編譯器並不支援namespace?這種情況當然是存在的,所以為了保持向後相容性,stl中使用了條件編譯。
最近讀stl原始碼(sgi版本)的時候發現了一種很奇怪的情況:有些標頭檔案中包含了「__stl_begin_namespace」和「__stl_end_namespace」這樣不倫不類的語句,而且編輯器在下面加上了下劃線,顯然是編輯器所不能解析的。
在網上搜尋了一下,發現原因如下:
#ifndef __sgi_stl_internal_iterator_h
#define __sgi_stl_internal_iterator_h
__stl_begin_namespace
struct input_iterator_tag {};
。。。。。。。。。。。。
這段**來自sgi stl中 stl_iterator.h
請問各位高手,這段**中的__stl_begin_namespace是幹什麼用的,放在這裡不會出錯嗎?
答案1:
看stl_config.h:
00205 # if defined(__stl_use_namespaces) && !defined(__stl_no_namespaces)
00206 # define __std std
00207 # define __stl_begin_namespace namespace std
00209 # define __stl_use_namespace_for_relops
00210 # define __stl_begin_relops_namespace namespace std
00212 # define __std_relops std
00213 # else
00214 # define __std
00215 # define __stl_begin_namespace
00216 # define __stl_end_namespace
00217 # undef __stl_use_namespace_for_relops
00218 # define __stl_begin_relops_namespace
00219 # define __stl_end_relops_namespace
00220 # define __std_relops
00221 # endif
在支援namespace的環境下,配合__stl_end_namespace使用namespace std
namespace std //__stl_end_namespace
答案2:
__stl_begin_namespace巨集是在某個配置檔案中定義的,就sgi來說,此巨集為了相容一些早期**,允許stl模板庫不是用std命名空間包裹,__stl_begin_namespace根據使用者配置,被定義為「空」或者「namespace std ,在不支援namespace的使用者環境下會被忽略。
STL 中sort原始碼分析
以sgi的stl為例 sort有兩種過載形式 template randomaccessiterator void sort randomaccessiterator first,randomaccessiterator last template strictweakordering void s...
STL 原始碼閱讀
1 這裡可以看出來,容器將迭代器作為類成員。vectora iteratorite a.begin 容器的成員函式可以返回迭代器,所以迭代器是容器的成員物件。2 個人理解,迭代器是對指標的封裝和提公升,盡可能遮蔽資料結構的底層細節,對外提供統一的操作介面,這些介面跟普通指標的功能類似,比如自增或自減...
STL原始碼簡述
stl是standard template library的簡稱,中文名標準模板庫,惠普實驗室開發的一系列軟體的統稱。從根本上說,stl是一些 容器 的集合,這些 容器 有list,vector,set,map等,stl也是演算法和其他一些元件的集合。這裡的 容器 和演算法的集合指的是世界上很多聰明...