Udostępnij za pośrednictwem


C6217

Ostrzeżenie C6217: niejawna cast między całkowitą semantycznie różnych typów: testowanie HRESULT z "nie".Należy wziąć pod uwagę przy użyciu udało się lub nie powiodło się makro w zamian.

To ostrzeżenie wskazuje, że HRESULT jest testowany nie (!) operatora.SUKCES (S_OK) w HRESULT jest wskazany przez wartość 0.Jednakże wartość 0 wskazuje brak dla typu Boolean.Badania HRESULT z nie operatora (!) do określania kodu, który blok do uruchomienia może spowodować po ścieżce niewłaściwy kod.Będzie to prowadzić do niepożądanych wyników.

Przykład

Poniższy kod generuje to ostrzeżenie, ponieważ nie operator jest używana do określenia Powodzenie lub niepowodzenie HRESULT wartości.W przypadku ścieżki niewłaściwy kod jest wykonywany, ponieważ ( !hr ) uruchamia kod błędu:

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

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

Aby skorygować to ostrzeżenie, następujący kod używa FAILED makro, aby wyszukać awarii:

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

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

W przypadku tego ostrzeżenia, SCODE typu jest równoważne z HRESULT.

Sukces typowe wartości HRESULT (S_OK) jest false gdy bada się jako wartość logiczna.

Aby sprawdzić, czy HRESULT jest sukces, użyj SUCCEEDED makro zamiast.