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 宏。

有关详细信息,请参阅 成功宏失败宏

请注意使用 malloc 和free (相关的动态内存分配 API)在内存泄漏和异常方面具有很多缺陷。若要完全避免这些泄漏和异常问题,请使用 C++ 标准模板库 (STL) 提供的结构。这些包括shared_ptr, unique_ptr, 和 vector有关更多信息,请参见智能指针(现代 C++)C++ 标准库参考