Leer en inglés

Compartir a través de


Advertencia C6221

Conversión implícita entre tipos enteros semánticamente diferentes: comparando HRESULT con un entero. Considere la posibilidad de usar SUCCEEDED o FAILED macros en su lugar

Esta advertencia indica que un tipo HRESULT se está comparando con un entero distinto de cero.

Comentarios

Un éxito en una HRESULT (S_OK) se representa mediante un 0. Por lo tanto, una conversión implícita de a HRESULT un entero genera un valor incorrecto y es probable que provoque el resultado incorrecto. El error suele deberse a la espera errónea de que una función devuelva un entero cuando realmente devuelve un HRESULT.

Nombre de análisis de código: COMPARING_HRESULT_TO_INT

Ejemplo

El código siguiente genera la advertencia C6221 comparando un HRESULT objeto con un valor entero:

C++
#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:

C++
#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 SUCCEEDED Macro y FAILED Macro.

El uso de malloc y free (y las API de asignación dinámica de memoria relacionadas) tiene muchos problemas en términos de pérdidas de memoria y excepciones. Para evitar estos tipos de posibles fugas por completo, use los mecanismos proporcionados por la biblioteca estándar de C++ (STL). Entre ellos se incluyen shared_ptrlos contenedores , unique_ptry , como vector. Para más información, consulte los artículos sobre punteros inteligentes y la biblioteca estándar de C++.