다음을 통해 공유


C6217

경고 C6217: 의미 체계가 다른 정수 형식 간의 암시적 캐스팅입니다. 'not'을 사용하여 HRESULT를 테스트하고 있습니다.SUCCEEDED 또는 FAILED 매크로를 대신 사용하십시오.

이 경고는 HRESULT를 not(!) 연산자로 테스트하고 있음을 나타냅니다.HRESULT에서 성공(S_OK)은 0 값으로 나타냅니다.하지만 0은 부울 형식에서는 실패를 나타냅니다.HRESULT를 not 연산자(!)로 테스트하여 실행할 코드 블록을 결정하면 잘못된 코드 경로를 따르게 될 수 있습니다.이 경우 원치 않는 결과가 발생할 수 있습니다.

예제

다음 코드에서는 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 매크로를 대신 사용하십시오.