【发布时间】:2010-08-12 14:49:07
【问题描述】:
我需要为回调函数编写代码(它将在 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能不能把非空指针变成空指针?
【问题讨论】:
-
为什么不只是无条件地转换,并在转换后检查 null ? static_cast 不会取消引用指针。
-
@Logan Capaldo:尽早检查感觉更好。
标签: c++ visual-c++ pointers static-cast