STL原始碼中對Namespace的條件編譯

2021-09-06 09:57:47 字數 1581 閱讀 9730

現代程式猿們對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也是演算法和其他一些元件的集合。這裡的 容器 和演算法的集合指的是世界上很多聰明...