Compartir a través de


C6221

advertencia C6221: Conversión implícita entre tipos enteros semánticamente diferentes: comparando HRESULT con un entero.Considere utilizar en su lugar la macro SUCCEEDED o FAILED.

Esta advertencia indica que un tipo HRESULT se está comparando con un entero distinto de cero.Si el resultado de HRESULT es correcto (S_OK), se representa con un 0.Por consiguiente, la conversión implícita de un HRESULT en un entero generará un valor incorrecto y, con toda probabilidad, dará lugar a un resultado incorrecto.Con frecuencia la causa es que se espera que una función devuelva un entero cuando, en realidad, devuelve un HRESULT.

Ejemplo

El código siguiente genera esta advertencia, al comparar HRESULT con un valor entero:

#include <windows.h>

HRESULT f( )
{
  HRESULT hr;
  LPMALLOC pMalloc;
  
  hr = CoGetMalloc(1, &pMalloc);
  if (hr == 4)
  {
    // failure code ...
    return S_FALSE;
  }
  else
  {
    // success code ...
    return S_OK;
  }
}

Para corregir esta advertencia, el código siguiente usa la macro FAILED:

#include <windows.h>

HRESULT f( )
{
  HRESULT hr;
  LPMALLOC pMalloc;
  
  hr = CoGetMalloc(1, &pMalloc);
  if (FAILED(hr))
  {
    // failure code ...
    return S_FALSE;
  }
  else
  {
    // success code ...
    return S_OK;
  }
}

Para esta advertencia, el tipo SCODE es equivalente a HRESULT.

Para obtener más información, vea las macros SUCCEEDED y FAILED.