Partager via


C6221

avertissement C6221 : cast implicite entre types d'entiers sémantiquement différents : comparaison de HRESULT à un entier. Si possible, utilisez la macro SUCCEEDED ou FAILED à la place.

Cet avertissement indique que HRESULT est comparé à un entier autre que zéro. Une réussite dans HRESULT (S_OK) est représentée par la valeur 0. Par conséquent, un cast implicite d'un HRESULT vers un entier générera une valeur incorrecte et conduira vraisemblablement à un résultat incorrect. Il est souvent provoqué par le code qui s'attend par erreur à ce qu'une fonction retourne un entier lorsqu'elle retourne en réalité HRESULT.

Exemple

Le code suivant génère cet avertissement en comparant HRESULT à une valeur entière :

#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;
  }
}

Pour corriger cet avertissement, le code suivant utilise 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;
  }
}

Pour cet avertissement, le type SCODE équivaut à HRESULT.

Pour plus d'informations, consultez SUCCEEDED, macro et FAILED, macro.