Condividi tramite


C6217

avviso C6217: Cast implicito tra tipi integer semanticamente diversi: test di HRESULT con 'not' in corso. Considerare viceversa l'utilizzo della macro SUCCEEDED or FAILED.

L'avviso indica che un tipo HRESULT è sottoposto a test con l'operatore not (!). L'esito positivo (S_OK) in HRESULT viene indicato da un valore 0. 0 indica tuttavia un errore per un tipo boolean. 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 correggere questo avviso, 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 in genere indica l'esito positivo di HRESULT (S_OK) è false quando viene testato come valore booleano.

Per verificare se HRESULT ha esito positivo, utilizzare la macro SUCCEEDED.