C6217

警告 C6217:语义不同的整数类型之间的隐式强制转换: 使用“not”测试 HRESULT。 考虑改用 SUCCEEDEDFAILED 宏。

此警告意味着 HRESULT 是用 not (!) 运算符测试的。 在 HRESULT 中,0 值表示成功 (S_OK)。 但是,对于布尔值类型来说,0 指示失败。 如果通过用 not 运算符 (!) 测试 HRESULT 来确定要运行的代码块,则可能导致遵循错误的代码路径。 这将导致意外的结果。

示例

在下面的代码中,因为使用 not 运算符来确定 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 宏。