Compartir a través de


C6217

Advertencia C6217: Conversión implícita entre tipos de enteros semánticamente diferentes: probando HRESULT con 'not'.Considere utilizar CORRECTO o ERROR macro en su lugar.

Esta advertencia indica que HRESULT se está probando con el operador NOT (!).Un valor de 0 indica un acierto (S_OK) en HRESULT.Sin embargo, 0 indica error en un tipo booleano.Probar HRESULT con el operador NOT (!) para determinar qué bloque de código se debe ejecutar puede producir la siguiente ruta de acceso de código incorrecta.Esto provocará resultados no deseados.

Ejemplo

El código siguiente genera esta advertencia porque el operador NOT se utiliza para determinar si un valor de HRESULT ha resultado correcto o erróneo.En este caso, se ejecuta una ruta de acceso de código incorrecta, porque ( !hr ) ejecuta el código de error:

#include <windows.h>
#include <objbase.h>

void f( )
{
  HRESULT hr = CoInitialize(NULL); 
  if (!hr)
  {
    // failure code ...
  }
  else
  {
    // success code ...
  }
}

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

#include <windows.h>
#include <objbase.h>

void f( )
{
  HRESULT hr = CoInitialize(NULL);  
  if (FAILED(hr))
  {
    // failure code ...
  }
  else
  {
    // success code ...
  }
}

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

El valor típico de operación correcta de HRESULT (S_OK) es false cuando se prueba como valor booleano.

Para comprobar si HRESULT es correcto, utilice en su lugar la macro SUCCEEDED.