C6217
Aggiornamento: novembre 2007
C6217
avviso C6217: Cast implicito tra tipi integer semanticamente diversi: test di HRESULT con 'not' in corso. Si consiglia l'utilizzo della macro SUCCEEDED o FAILED
L'avviso indica che un tipo HRESULT è sottoposto a test con l'operatore not (!). L'esito positivo (S_OK) in HRESULT è indicato da un valore 0. Per un tipo Boolean, invece, 0 indica un esito negativo. Il test di HRESULT con l'operatore not (!) per determinare il blocco di codice da eseguire può indurre a seguire un percorso di codice non corretto e provocare risultati indesiderati.
Esempio
Il codice riportato di seguito genera l'avviso perché viene utilizzato l'operatore not per determinare l'esito positivo o negativo di un valore HRESULT. In questo caso, il percorso di codice non corretto viene eseguito perché ( !hr ) determina l'esecuzione del codice erroneo:
#include <windows.h>
#include <objbase.h>
void f( )
{
HRESULT hr = CoInitialize(NULL);
if (!hr)
{
// failure code ...
}
else
{
// success code ...
}
}
Per risolvere il problema, il codice seguente utilizza la macro FAILED per ricercare l'errore:
#include <windows.h>
#include <objbase.h>
void f( )
{
HRESULT hr = CoInitialize(NULL);
if (FAILED(hr))
{
// failure code ...
}
else
{
// success code ...
}
}
Ai fini del presente avviso, il tipo SCODE equivale a HRESULT.
Il valore che solitamente indica l'esito positivo di HRESULT (S_OK)è false quando viene sottoposto a test come valore booleano.
Per verificare se HRESULT ha esito positivo, utilizzare la macro SUCCEEDED.