加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – static_cast可以将非空指针转换为空指针吗?

发布时间:2020-12-16 07:52:22 所属栏目:百科 来源:网络整理
导读:我需要为回调函数编写代码(它将在ATL中调用,但这并不重要): HRESULT callback( void* myObjectVoid ){ if( myObjectVoid == 0 ) { return E_POINTER; } CMyClass* myObject = static_castCMyClass*( myObjectVoid ); return myObject-CallMethod();} 这里的
我需要为回调函数编写代码(它将在ATL中调用,但这并不重要):
HRESULT callback( void* myObjectVoid )
{
    if( myObjectVoid == 0 ) {
       return E_POINTER;
    }
    CMyClass* myObject = static_cast<CMyClass*>( myObjectVoid );
    return myObject->CallMethod();
}

这里的void *保证是一个指向CMyClass的指针,因此static_cast是合法的.我担心的是代码必须尽可能便携(至少对于较新版本的Visual C).因此,为了超级偏执,我倾向于检查CMyClass *指针 – 我的意思是如果它被证明是空的?

if( myObjectVoid == 0 ) {
       return E_POINTER;
    }
    CMyClass* myObject = static_cast<CMyClass*>( myObjectVoid );
    if( myObject == 0 ) {
       return E_POINTER;
    }

第二次检查合理吗? static_cast是否可以将非空指针转换为空指针?

解决方法

如果在不同偏移量的对象部分之间进行转换,static_cast可以更改指针值:
class A{ int x; }; class B{ int y; };
class C : A,B {};

C *c=new C(); 

B *b=c; 
// The B part comes after the A part in C. Pointer adjusted

C *c2=static_cast<C*>(b); 
// Pointer gets adjusted back,points to the beginning of the C part

但是,“空指针值(4.10)被转换为空指针值目标类型.“(5.2.9-8),即如果c为NULL,则b也为NULL(并且未调整),因此c2设置为NULL.整个意思是:如果静态转换非NULL myObjectVoid产生NULL,那么myObjectVoid的值是通过以某种方式绕过类型系统获得的.这意味着,编译器可能会抛弃你的第二个检查,因为“它无论如何都不会发生”.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读