C6217
警告 C6217:语义不同的整数类型之间的隐式强制转换: 使用“not”测试 HRESULT。 考虑改用 SUCCEEDED 或 FAILED 宏。
此警告意味着 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 宏。