天天看点

SGI stl_config

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

用来表示编译器是否支持宽字节.

  1. __STL_NO_DRAND48

    是否有drand488函数,根据编译器的不同进行定义

  2. __STL_STATIC_TEMPLATE_MEMBER_BUG

    表示编译器在模板类中是否支持定义静态成员

  3. __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