Мне нужно написать код для функции обратного вызова (она будет вызываться из 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
превратить ненулевой указатель в нулевой указатель?