Поделиться через


C6217

Предупреждение C6217: неявное приведение между семантически различными целочисленными типами: проверка HRESULT с "not". Попробуйте вместо этого использовать макро SUCCEEDED или FAILED.

Данное предупреждение указывает, что значение HRESULT проверяется с помощью оператора НЕ (!). Успех (S_OK) в HRESULT обозначается значением 0. Однако для логического типа значение 0 означает неудачу. Проверка HRESULT с помощью оператора НЕ (!) для определения выполняемого блока кода может привести к следованию по неверной ветви кода. Что, в свою очередь, ведет к нежелательным результатам.

Пример

В следующем коде создается данное предупреждение по причине использования оператора НЕ для определения успеха или неудачи значения HRESULT. В этом случае выполняется неверная ветвь кода, поскольку оператор ( !hr ) инициирует код неудачи:

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

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

Для устранения этого предупреждения в следующем коде для определения неудачи используется макрос FAILED :

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

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

Для данного предупреждения тип SCODE эквивалентен HRESULT.

При проверке HRESULT в качестве логического типа значением успеха (S_OK), как правило, является false.

Для проверки успешности значения HRESULT следует использовать макрос SUCCEEDED.