[ Warning C4800 ] bool 값 강제에 대한 성능 경고 - 해결방법


[ Warning C4800 ] bool 값 강제에 대한 성능 경고   - C++  

 예를 들어,  아래와 같은 코드는 "Warning C4800"을 발생시킨다.

int main()
{
   int i = 0;
   bool j = i;   // Warning C4800
   j++;
}

  Warning C4800 'int' : 'true" 또는 'false'로 bool 값을 강제하고 있습니다.
 
  정보의 바다 인터넷에 이것의 해결법이 이것저것 돌아다니던데, 이 경고가 뜨는 정확한 이유에 대한 설명은 어디에도 없어서 직접 MSDN에 들어가보았다.
 
MSDN에서의 설명을 적당히 번역하면 아래와 같다. ( 영어 원문은 이 글 마지막 부분에 있다. )
 
< Compiler Warning (level 3) C4800 >
 
  이 warning은 bool 값이 아닌 다른 값을 bool type 변수에 할당하거나 강제로 넣으려 할 때 일어난다.  일반적으로, 이 메세지는 int 변수가 오로지 ture나 false 값을 가지고 있을 때, int 변수를 bool 변수에 할당하려다가 일어난다.  또는 int 변수를 bool type 으로 재선언(redeclaratioon) 하려고 할 때 나타난다.  만약에 당신이 표현식(expression)을 bool type을 쓰도록 다시 쓸 수 없다면, 표현식에다가 "!=0"을 더해서 사용하면 될 것이다.  이 방법이 bool type 값을 주기 때문이다.  bool type으로 표현식을 변환(type casting) 하는 것은 이 warning을 없에지 못한다. 그렇게 설계되어 있기 때문이다.
 
 위의 설명을 읽으시고, 이미 아셨겠지만 아래와 같은 type casting으로는 이 경고가 사라지지 않는다는 말이다.
 
 bool j = static_cast<bool>( i );
 
  위에 써 있는대로 "!= 0" 을 넣어서 아래와 같이 쓰면, Warning C4800 을 아주 쉽게 해결할 수 있다. 
 
 bool j = ( i != 0 );
 
 아마도 이 Warning은 int 변수인 i의 값이 0이나 1이 아닐 경우를 경고하기 위해서 존재하는 것 같다.  대부분의 프로그래머는 자신의 프로그래밍 실력을 믿고 int 변수 i에 0이나 1 이외의 값은 들어가지 않도록 프로그래밍을 했다고 믿고 bool 변수에 int i 값을 할당하려 할 것이다.  하지만 혹시 실수하거나 잘못해서 0, 1 이외의 값이 int 변수에 할당되어 있을 수도 있다.  바로 이런 상황을 경고해주는 것이리라.  컴파일러로서는 매우 바람직한 일이다.  (우리가 왜 그렇게 const 키워드를 프로그램에 들이대겠는가? 혹시라도 모를 실수 방지 차원 아닌가!) 
 
 
<Reference >
1. MSDN : http://msdn.microsoft.com/en-us/library/b6801kcy(VS.71).aspx 

이 글을 공유하기

댓글

Designed by JB FACTORY