注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

一路

To find the final symmetry & beauty

 
 
 

日志

 
 
 
 

SGI STL源码阅读笔记3.编译器组态测试[原创]  

2011-02-14 20:11:53|  分类: c++学习笔记 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

此部分功能设在stl_config.h头文件中,这个文件sgi官方已给了不少注释。侯捷的《stl源码剖析》中另加了注释,他写书时的stl_config.h文件与现在的有些差异,有几个地方我加了一些,可以在这里找到。

http://saturnman.blog.163.com/blog/static/55761120111147835400/

这个文件里都是对一些编译器的组态测试,其实不是真的对编译器的能力进行测试,说到测试其实是对其进行权举,一般编译器厂商都会在其编译器编译代码时把一些预定义的宏传到源代码,我们就可以通过这些宏来得到编译器版本与配置之类的信息,之后对此版本进行人工测试之后把结果以宏的方式写入stl_config.h文件中。比如某一编译器有一些功能缺陷时,我们可以选择绕过这个缺陷的办法或是不使用这个特性,也有一些编译器有一些特别的提高代码效率的功能,我们也可以加以利用。这样就像是在原编译器上加上了一层抽象,可以便这份STL源代码通用性更强,关于一些宏的语法,可以查我以前的笔记日志。

http://predef.sourceforge.net/ 这个网站总结了一些常见编译器的内置宏,十分完善。可以写一些测试代码测试这些宏。有一些stl_config.h中的C++特性定义可以有些让人困惑,我这里把几个不常见的或是不常想得到的总结了一下,你可以试着编译这份代码以查看结果。

#include<iostream>//for cout,endl

#include<cstdio>//for fprintf

#include<cstdlib>//for abort

using namespace std;

//runtime assertion use macro

//the abort function was commented out for not disturb out whole test

#define __my_assert(expr)\

    if(!(expr)){fprintf(stderr,"%s:%d STL assertion failed. %s\n"\

            ,__FILE__,__LINE__,# expr);/*abort();*/}

//class template partial specialization

//__STL_CLASS_PARTIAL_SPECIALIZATION

template<typename T,typename U>

class A

{

    public:

    A()

    {

        cout<<"template T,U"<<endl;

    }

};

template<typename T>

class A<T,T>

{

    public:

    A()

    {

        cout<<"template T,T"<<endl;

    }

};

//class template static member bug

// __STL_STATIC_TEMPLATE_MEMBER_BUG

template<typename T>

class B

{

    public:

    static int value;

};

template<> int B<int>::value = 10;

template<> int B<double>::value  = 20;

//initialize const integers in a class bug

//__STL_STATIC_CONST_INIT_BUG

class C

{

    public:

        //standard syntax

        static int const value = 10;

        //special technique if standard syntax can't be used.

        enum Val{value2 = 20};

};

//function template partial order feature

//__STL_FUNCTION_TMPL_PARTIAL_ORDER

//http://saturnman.blog.163.com/blog/static/557611201111474443951/

template<typename T>

void func1(T t)

{

    cout<<"func1 1"<<endl;

}

 

template<typename T>

void func1(T* t)

{

    cout<<"func1 2"<<endl;

}

template<typename T>

void func2(T t)

{

    cout<<"func2"<<endl;

}

//bounded friend templates syntax

template<typename T>

class D

{

    public:

        //normal friend function syntax

        //this is not standard syntax

        friend void friend_func1(const D&)

        {

            static int value = 0;

            cout<<"friend_func1 called "<<value<<" times."<<endl;

            ++value;

        }

        //bounded friend function syntax

        //I prefer this syntax

        friend void friend_func2(const D<T>&)

        {

            static int value = 0;

            cout<<"friend_func2 called "<<value<<" times."<<endl;

            ++value;

        }

        //friend void friend_func<>(const D&) g++ does not support this syntax

};

int main()

{

    //test assertion

    cout<<"//test assertion"<<endl;

    __my_assert(1>2);

    //test partial specialization

    cout<<"//test partial specialization"<<endl;

    A<int,double> a;

    A<int,int> b;

    //test template class member initialization

    cout<<"//test template class member initialization"<<endl;

    cout<<"B<int>>::value="<<B<int>::value<<endl;

    cout<<"B<double>::value="<<B<double>::value<<endl;

    //test const integer initialization

    cout<<"test const integer initialization"<<endl;

    C c;

    cout<<"c.value="<<c.value<<endl;

    cout<<"c.value2="<<c.value2<<endl;

    //test function template partial order

    cout<<"test function template partial order."<<endl;

    int param1 = 10;

    int* param2 = NULL;

    func1(param1);

    func1(param2);

    func2(param1);

    func2(param2);

    //test bounded friend template

    cout<<"test bounded friend template"<<endl;

    D<char> d1;

    D<int> d2;

    friend_func1(d1);

    friend_func1(d2);

    friend_func2(d1);

    friend_func2(d2);

}

 

 

如果编译器的功能不够完全工是对标准支持不佳,可能会出现编译错误。总之想读懂sgi stl的源代码,对C++语言本身的一些特性还是要熟知的,不然读代码会十分费力且收获不大,进一步的内容可参看<<STL源码剖析>>一书。

Ref:

侯捷<<STL源码剖析>>

 

  评论这张
 
阅读(977)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017