您的位置:首页 > 其它

STL stl_config.h

2015-11-23 11:29 260 查看
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:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: