+ -
当前位置:首页 → 问答吧 → 这段奇怪的给VC专用的代码是干什么的?

这段奇怪的给VC专用的代码是干什么的?

时间:2011-11-30

来源:互联网

代码源于Ogre::Singleton,是一个singleton基类。
为什么对于MSVC版本小于1200,就要在存地址的时候加上一个偏移?
只把相关部分列在这里:
C/C++ code


namespace Ogre {
    template <typename T> class Singleton
    {
    protected:
        static T* ms_Singleton;

        public:
        Singleton( void )
        {
            assert( !ms_Singleton );
#if defined( _MSC_VER ) && _MSC_VER < 1200     
            int offset = (int)(T*)1 - (int)(Singleton <T>*)(T*)1;
            ms_Singleton = (T*)((int)this + offset);
#else
        ms_Singleton = static_cast< T* >( this );
#endif
        }
    };

作者: jiandingzhe   发布时间: 2011-11-30

1200是vc6的编译器版本号,ms先前的vc编译器类类型指针强制转换时,指针的值会发生变化(this指针调整?)。
木有见过vc6以前的编译器,瞎猜的。

作者: Demon__Hunter   发布时间: 2011-11-30


可能是1200以前的版本没有static_cast<>吧

作者: luciferisnotsatan   发布时间: 2011-11-30

引用 2 楼 luciferisnotsatan 的回复:
可能是1200以前的版本没有static_cast<>吧

这个最有可能了

作者: Demon__Hunter   发布时间: 2011-11-30

引用 2 楼 luciferisnotsatan 的回复:
可能是1200以前的版本没有static_cast<>吧

为啥没有static_cast就要偏移地址?

作者: jiandingzhe   发布时间: 2011-11-30