SGI版的stl庫中在stl_config.h頭檔案中定義了裡面所需要使用的所有的宏.提供對不同版本不同編譯器的支援
根據編譯器不同定義的宏
1. __STL_NO_BOOL
定義方式:
#if !defined(_BOOL)
#define __STL_NO_BOOL
在某些特定的編譯器下會進行定義,如
# if defined(__SUNPRO_CC)
#define __STL_NO_BOOL
這個宏生效之後,通過下面這種方式定義出一個bool類型
# if defined(__STL_NO_BOOL) && !defined(__STL_DONT_USE_BOOL_TYPEDEF)
typedef int bool;
#define true 1
#define false 0
# endif
2. __STL_HAS_WCHAR_T
用來表示編譯器是否支援寬位元組.
-
__STL_NO_DRAND48
是否有drand488函數,根據編譯器的不同進行定義
-
__STL_STATIC_TEMPLATE_MEMBER_BUG
表示編譯器在模闆類中是否支援定義靜态成員
-
__STL_STATIC_CONST_INIT_BUG
表示類中的靜态常量成員是否能在類中進行初始化
class Demo
{
static const int num = ;
};
6.__STL_CLASS_PARTIAL_SPECIALIZATION
表示是否支援模闆類的局部特化
7. __STL_PARTIAL_SPECIALIZATION_SYNTAX
是否支援類模闆中的部分排序…
用模闆函數來舉例
template<typename T>
void foo(T t){}
template<typename T>
void foo(T *t){}
template<>
void foo(int *t){}
在決定特化的int類型函數歸屬的時候,就會用到這個特性..根據該特性,它屬于第二個模闆函數
8.__STL_FUNCTION_TMPL_PARTIAL_ORDER
是否支援函數模闆中的部分排序
9.__STL_MEMBER_TEMPLATES
是否支援模闆類中定義模闆函數
10.__STL_MEMBER_TEMPLATE_CLASSES
是否支援内部類為一個模闆類
11.__STL_TEMPLATE_FRIENDS
一個模闆類是否可以為其他類的友元
12.__STL_EXPLICIT_FUNCTION_TMPL_ARGS
是否支援函數對模闆參數的推導
13.__STL_LIMITED_DEFAULT_TEMPLATES
前一個模闆參數是否能為後一個模闆參數的預設值
template<typename T, typename CON = std::vector<T> >
14.__STL_NON_TYPE_TMPL_PARAM_BUG
無類型的模闆參數
template<int size>
class Demo{};
15.__SGI_STL_NO_ARROW_OPERATOR
編譯器是否支援疊代器中的operator->
16.__STL_DEFAULT_CONSTRUCTOR_BUG
是否支援 int(num)這種構造方式
17.__STL_USE_EXCEPTIONS
是否支援異常
18.__STL_USE_NAMESPACES
是否使用命名空間
19.__STL_NO_EXCEPTION_HEADER
是否有exception頭檔案
20.__STL_NO_BAD_ALLOC
是否有new頭檔案,,或者這個頭檔案中是否有bad_alloc class.
21.__STL_SGI_THREADS
__STL_WIN32THREADS
__STL_PTHREADS
__STL_UITHREADS
_STL_THREADS
__STL_VOLATILE
線程相關的宏
22.__STL_LONG_LONG
是否支援long long
23.__STL_USE_CONCEPT_CHECKS
進行編譯時的安全檢查
24.__STL_NO_USING_CLAUSE_IN_CLASS
類定義中是否支援使用using
25.__STL_NO_FRIEND_TEMPLATE_CLASS
編譯器是否支援友元為一個模闆類
26.__STL_NO_FUNCTION_PTR_IN_CLASS_TEMPLATE
是否支援模闆參數為一個函數指針
27.__STL_MEMBER_TEMPLATE_KEYWORD
是否支援template為模闆的關鍵字
使用者自定義的宏
1.__STL_USE_SGI_ALLOCATORS
如果定義了它,,将會使用舊的SGI的allocator.
2.__STL_NO_NAMESPACES
定義了它,,将不會将該stl庫加入std這個名字空間中
3.__STL_NO_RELOPS_NAMESPACE
定義了它,,一些操作運算符(>, <=. >=, !=)就不會加入到std::rel_opsz中
4.__STL_ASSERTIONS
會通過assert進行運作時的檢查
5._PTHREADS
_UITHREADS
_NOTHREADS
線程相關
6._STL_NO_CONCEPT_CHECKS
不進行錯誤檢查
7.__STL_USE_NEW_IOSTREAMS
定義它,,會使用iosfwd,,否則使用iostream