C6220

警告 C6220 - 语义不同的整数类型之间的隐式强制转换: 将 HRESULT 与 -1 进行比较。 应考虑改用 SUCCEEDED 或 FAILED 宏

此警告意味着要将 HRESULT 与显式的非 HRESULT 值 -1 进行比较,该值不是格式良好的 HRESULT。 HRESULT 中的失败 (E_FAIL) 不由 -1 表示。 因此,如果将 HRESULT 隐式强制转换为整数,则将生成错误的值并可能导致错误的结果。

示例

在大多数情况下,产生此警告的原因在于,代码错误地认为通过使用 –1 作为失败值,函数应当返回 HRESULT 而非整数。 下面的代码示例生成此警告:

#include <windows.h>

HRESULT f( )
{
  HRESULT hr;
  LPMALLOC pMalloc;
  
  hr = CoGetMalloc(1, &pMalloc);
  if (hr == -1)
  {
    // failure code ...
    return E_FAIL;
  }
  else
  {
    // success code ...
    return S_OK;
  }
}

最好使用 SUCCEEDED 或 FAILED 宏来测试 HRESULT 的值。 若要更正此警告,请使用下面的代码:

#include <windows.h>

HRESULT f( )
{
  HRESULT hr;
  LPMALLOC pMalloc;
  
  hr = CoGetMalloc(1, &pMalloc);
  if (FAILED(hr))
  {
    // failure code ...
    return E_FAIL;
  }
  else
  {
    // success code ...
    return S_OK;
  }
}

对于此警告,SCODE 类型等效于 HRESULT。

对于特定的 HRESULT 值,如 E_FAIL,适合检查显式比较结果。 否则,使用 SUCCEEDED 或 FAILED 宏。

有关更多信息,请参见 SUCCEEDED Macro(SUCCEEDED 宏)和 FAILED Macro(FAILED 宏)。