stl_config.h
1. // Filename: stl_config.h
2.
3. // Comment By: 凝霜
4. // E-mail: mdl2009@vip.qq.com
5. // Blog: http://blog.csdn.net/mdl13412
6.
7. /*
8. * Copyright (c) 1996-1997
9. * Silicon Graphics Computer Systems, Inc.
10. *
11. * Permission to use, copy, modify, distribute and sell this software
12. * and its documentation for any purpose is hereby granted without fee,
13. * provided that the above copyright notice appear in all copies and
14. * that both that copyright notice and this permission notice appear
15. * in supporting documentation. Silicon Graphics makes no
16. * representations about the suitability of this software for any
17. * purpose. It is provided "as is" without express or implied warranty.
18. */
19.
20. /* NOTE: This is an internal header file, included by other STL headers.
21. * You should not attempt to use it directly.
22. */
23.
24. #ifndef __STL_CONFIG_H
25. #define __STL_CONFIG_H
26.
27. // 本配置文件功能表:
28. // (1) 如果不编译器没有定义bool, true, false则定义
29. // (2) 如果编译器不支持drand48()函数则定义__STL_NO_DRAND48
30. // 注: drand48产生双精度的伪随机数, 因为采用了48bit计算, 故名drand48
31. // (3) 如果编译器不支持static members of template classes(模板类静态成员),
32. // 则定义__STL_STATIC_TEMPLATE_MEMBER_BUG
33. // (4) 如果编译器不支持'typename'关键字, 则将'typename'定义为空(null macro)
34. // (5) 如果编译器支持partial specialization of class templates(模板类偏特化),
35. // 则定义__STL_CLASS_PARTIAL_SPECIALIZATION
36. // 参考文献: http://msdn.microsoft.com/en-us/library/9w7t3kf1(v=VS.71).aspx
37. // (6) 如果编译器支持partial ordering of function templates(模板函数特化优先级),
38. // 则定义__STL_FUNCTION_TMPL_PARTIAL_ORDER
39. // 参考资料: http://msdn.microsoft.com/zh-cn/library/zaycz069.aspx
40. // (7) 如果编译器支持calling a function template by providing its template
41. // arguments explicitly(显式指定调用模板函数的模板参数)
42. // 则定义__STL_EXPLICIT_FUNCTION_TMPL_ARGS
43. // (8) 如果编译器支持template members of classes(类模板成员),
44. // 则定义__STL_MEMBER_TEMPLATES
45. // (9) 如果编译器不支持'explicit'关键字, 则将'explicit'定义为空(null macro)
46. // (10) 如果编译器不能根据前一个模板参数设定后面的默认模板参数,
47. // 则定义__STL_LIMITED_DEFAULT_TEMPLATES
48. // (11) 如果编译器处理模板函数的non-type模板参数类型推断有困难,
49. // 则定义__STL_NON_TYPE_TMPL_PARAM_BUG
50. // (12) 如果编译器不支持迭代器使用'->'操作符,
51. // 则定义__SGI_STL_NO_ARROW_OPERATOR
52. // (13) 如果编译器(在当前编译模式下)支持异常,
53. // 则定义__STL_USE_EXCEPTIONS
54. // (14) 如果我们将STL放进命名空间中,
55. // 则定义__STL_USE_NAMESPACES
56. // (15) 如果本STL在SGI的编译器上编译, 并且用户没有选择pthreads或者no threads,
57. // 则默认使用__STL_SGI_THREADS
58. // 注: POSIX thread 简称为pthread, Posix线程是一个POSIX标准线程.
59. // (16) 如果本STL在Win32平台的编译器上使用多线程模式编译,
60. // 则定义__STL_WIN32THREADS
61. // (17) 适当的定义命名空间相关的宏(__STD, __STL_BEGIN_NAMESPACE, 等)
62. // (18) 适当的定义异常相关的宏(__STL_TRY, __STL_UNWIND, 等)
63. // (19) 根据是否定义__STL_ASSERTIONS, 将__stl_assert定义为断言或者空(null macro)
64.
65. #ifdef _PTHREADS
66. # define __STL_PTHREADS
67. #endif
68.
69. // 如果编译器不提供本STL需要的一些功能,则定义__STL_NEED_XXX
70. # if defined(__sgi) && !defined(__GNUC__)
71. # if !defined(_BOOL)
72. # define __STL_NEED_BOOL
73. # endif
74. # if !defined(_TYPENAME_IS_KEYWORD)
75. # define __STL_NEED_TYPENAME
76. # endif
77. # ifdef _PARTIAL_SPECIALIZATION_OF_CLASS_TEMPLATES
78. # define __STL_CLASS_PARTIAL_SPECIALIZATION
79. # endif
80. # ifdef _MEMBER_TEMPLATES
81. # define __STL_MEMBER_TEMPLATES
82. # endif
83. # if !defined(_EXPLICIT_IS_KEYWORD)
84. # define __STL_NEED_EXPLICIT
85. # endif
86. # ifdef __EXCEPTIONS
87. # define __STL_USE_EXCEPTIONS
88. # endif
89. # if (_COMPILER_VERSION >= 721) && defined(_NAMESPACES)
90. # define __STL_USE_NAMESPACES
91. # endif
92. # if !defined(_NOTHREADS) && !defined(__STL_PTHREADS)
93. # define __STL_SGI_THREADS
94. # endif
95. # endif
96.
97. # ifdef __GNUC__
98. # include <_G_config.h>
99. # if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 8)
100. # define __STL_STATIC_TEMPLATE_MEMBER_BUG
101. # define __STL_NEED_TYPENAME
102. # define __STL_NEED_EXPLICIT
103. # else
104. # define __STL_CLASS_PARTIAL_SPECIALIZATION
105. # define __STL_FUNCTION_TMPL_PARTIAL_ORDER
106. # define __STL_EXPLICIT_FUNCTION_TMPL_ARGS
107. # define __STL_MEMBER_TEMPLATES
108. # endif
109. /* glibc pre 2.0 is very buggy. We have to disable thread for it.
110. It should be upgraded to glibc 2.0 or later. */
111. # if !defined(_NOTHREADS) && __GLIBC__ >= 2 && defined(_G_USING_THUNKS)
112. # define __STL_PTHREADS
113. # endif
114. # ifdef __EXCEPTIONS
115. # define __STL_USE_EXCEPTIONS
116. # endif
117. # endif
118.
119. // Sun C++ compiler
120. # if defined(__SUNPRO_CC)
121. # define __STL_NEED_BOOL
122. # define __STL_NEED_TYPENAME
123. # define __STL_NEED_EXPLICIT
124. # define __STL_USE_EXCEPTIONS
125. # endif
126.
127. // TODO: 这个我没找到资料, 如果你知道或者有相关资料请联系我, Thank U
128. # if defined(__COMO__)
129. # define __STL_MEMBER_TEMPLATES
130. # define __STL_CLASS_PARTIAL_SPECIALIZATION
131. # define __STL_USE_EXCEPTIONS
132. # define __STL_USE_NAMESPACES
133. # endif
134.
135. // _MSC_VER 定义微软编译器的版本
136. // MS VC++ 10.0 _MSC_VER = 1600
137. // MS VC++ 9.0 _MSC_VER = 1500
138. // MS VC++ 8.0 _MSC_VER = 1400
139. // MS VC++ 7.1 _MSC_VER = 1310
140. // MS VC++ 7.0 _MSC_VER = 1300
141. // MS VC++ 6.0 _MSC_VER = 1200
142. // MS VC++ 5.0 _MSC_VER = 1100
143. # if defined(_MSC_VER)
144. # if _MSC_VER > 1000
145. # include <yvals.h>
146. # else
147. # define __STL_NEED_BOOL
148. # endif
149. # define __STL_NO_DRAND48
150. # define __STL_NEED_TYPENAME
151. # if _MSC_VER < 1100
152. # define __STL_NEED_EXPLICIT
153. # endif
154. # define __STL_NON_TYPE_TMPL_PARAM_BUG
155. # define __SGI_STL_NO_ARROW_OPERATOR
156. # ifdef _CPPUNWIND
157. # define __STL_USE_EXCEPTIONS
158. # endif
159. # ifdef _MT
160. # define __STL_WIN32THREADS
161. # endif
162. # endif
163.
164. # if defined(__BORLANDC__)
165. # define __STL_NO_DRAND48
166. # define __STL_NEED_TYPENAME
167. # define __STL_LIMITED_DEFAULT_TEMPLATES
168. # define __SGI_STL_NO_ARROW_OPERATOR
169. # define __STL_NON_TYPE_TMPL_PARAM_BUG
170. # ifdef _CPPUNWIND
171. # define __STL_USE_EXCEPTIONS
172. # endif
173. # ifdef __MT__
174. # define __STL_WIN32THREADS
175. # endif
176. # endif
177.
178.
179. # if defined(__STL_NEED_BOOL)
180. typedef int bool;
181. # define true 1
182. # define false 0
183. # endif
184.
185. # ifdef __STL_NEED_TYPENAME
186. # define typename
187. # endif
188.
189. # ifdef __STL_NEED_EXPLICIT
190. # define explicit
191. # endif
192.
193. # ifdef __STL_EXPLICIT_FUNCTION_TMPL_ARGS
194. # define __STL_NULL_TMPL_ARGS <>
195. # else
196. # define __STL_NULL_TMPL_ARGS
197. # endif
198.
199. # ifdef __STL_CLASS_PARTIAL_SPECIALIZATION
200. # define __STL_TEMPLATE_NULL template<>
201. # else
202. # define __STL_TEMPLATE_NULL
203. # endif
204.
205. // __STL_NO_NAMESPACES is a hook so that users can disable namespaces
206. // without having to edit library headers.
207. # if defined(__STL_USE_NAMESPACES) && !defined(__STL_NO_NAMESPACES)
208. # define __STD std
209. # define __STL_BEGIN_NAMESPACE namespace std {
210. # define __STL_END_NAMESPACE }
211. # define __STL_USE_NAMESPACE_FOR_RELOPS
212. # define __STL_BEGIN_RELOPS_NAMESPACE namespace std {
213. # define __STL_END_RELOPS_NAMESPACE }
214. # define __STD_RELOPS std
215. # else
216. # define __STD
217. # define __STL_BEGIN_NAMESPACE
218. # define __STL_END_NAMESPACE
219. # undef __STL_USE_NAMESPACE_FOR_RELOPS
220. # define __STL_BEGIN_RELOPS_NAMESPACE
221. # define __STL_END_RELOPS_NAMESPACE
222. # define __STD_RELOPS
223. # endif
224.
225. # ifdef __STL_USE_EXCEPTIONS
226. # define __STL_TRY try
227. # define __STL_CATCH_ALL catch(...)
228. # define __STL_RETHROW throw
229. # define __STL_NOTHROW throw()
230. # define __STL_UNWIND(action) catch(...) { action; throw; }
231. # else
232. # define __STL_TRY
233. # define __STL_CATCH_ALL if (false)
234. # define __STL_RETHROW
235. # define __STL_NOTHROW
236. # define __STL_UNWIND(action)
237. # endif
238.
239. #ifdef __STL_ASSERTIONS
240. # include <stdio.h>
241. # define __stl_assert(expr) \
242. if (!(expr)) { fprintf(stderr, "%s:%d STL assertion failure: %s\n", \
243. __FILE__, __LINE__, # expr); abort(); }
244. #else
245. # define __stl_assert(expr)
246. #endif
247.
248. #endif /* __STL_CONFIG_H */
249.
250. // Local Variables:
251. // mode:C++
252. // End: