Freigeben über


Warnung C6221

Implizite Umwandlung zwischen semantisch unterschiedlichen ganzzahligen Typen: Vergleich von HRESULT mit einer ganzen Zahl. Erwägen Sie stattdessen die Verwendung oder SUCCEEDED MakrosFAILED.

Hinweise

Diese Warnung gibt an, dass ein HRESULT mit einer ganzen Zahl ungleich 0 (null) verglichen wird.

Ein Erfolg in einem HRESULT (S_OK) wird durch eine 0 dargestellt. Daher generiert eine implizite Umwandlung einer HRESULT in eine ganze Zahl einen falschen Wert und führt wahrscheinlich zum falschen Ergebnis. Der Fehler wird häufig dadurch verursacht, dass eine Funktion versehentlich eine ganze Zahl zurückgibt, wenn sie tatsächlich eine HRESULT.

Name der Codeanalyse: COMPARING_HRESULT_TO_INT

Beispiel

Der folgende Code generiert warnungS-C6221 durch Vergleichen eines HRESULT Werts mit einem ganzzahligen Wert:

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

Um diese Warnung zu korrigieren, wird im folgenden Code das FAILED-Makro verwendet:

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

Bei dieser Warnung entspricht der SCODE-Typ HRESULT.

Weitere Informationen finden Sie unter SUCCEEDED "Makro " und FAILED "Makro".

Die Verwendung und mallocfree (und verwandte APIs für die dynamische Speicherzuweisung) hat viele Fallstricke in Bezug auf Speicherlecks und Ausnahmen. Um diese Arten potenzieller Lecks vollständig zu vermeiden, verwenden Sie die Mechanismen, die von der C++-Standardbibliothek (STL) bereitgestellt werden. Dazu gehören shared_ptr, , unique_ptrund Container wie vector. Weitere Informationen finden Sie unter Intelligente Zeiger und C++-Standardbibliothek.