C6217
警告 C6217: 語意不相同的整數型別之間發生隱含轉型: 以 'not' 測試 HRESULT。請考慮改用 SUCCEEDED 或 FAILED 巨集。
這項警告表示 HRESULT 是以 not (!) 運算子進行測試。HRESULT 中的成功 (S_OK) 是以 0 值表示。不過,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 巨集。