2009. 10. 30. 16:23

[VC++] Visual Studio Warning 해결법 모음.


 코딩을 하다보면 생각지도 못한 Warning(경고) 문구에 미학으로서나 버그유발가능성에 대해서 짜증을 금치 못하는 경우가 많습니다. (적어도 저는 그렇더군요)
 그냥 그때그때 문제 처리하고 기억하는 정도지만, 하루하루 코딩하다보면 새로운 경고나 기존의 경고에 대해 빠릿빠릿 처리 못하는 경우가 종종 생기곤 했는데.... 오늘에서야 차근차근 이 글에 정리를 해볼까 합니다.
뭐 아는게 없어서 자세히 작성은 못하겠지만, 해결법 없이는 올리지 않습니다.




 warning C4800: 'int' : 'true' 또는 'false'로 bool 값을 강제하고 있습니다(성능 경고).

  이 경고 메세지는 정수형 변수를 bool 형으로 강제로 변환하게 되었을때 나타나는 증상입니다. 가독성을 위한 소스코딩을 하다보면 종종 발생하는 부분입니다.

- 해결 방법
 전처리기 :  #define getBool(n) ((n) != 0)
 삼항연산자 : (n != 0) ? true : false;


 warning C4482: 비표준 확장이 사용되었습니다. 정규화된 이름에 '...' 열거형을 사용했습니다.

 이 경고 메세지는 형식 내부(클래스, 구조체, 네임스페이스 등)에 선언된 이름있는 enum(열거형)을 사용하게 되었을 때 나타나는 증상입니다.

 - 해결 방법
  잘못된 방법 : classname::enumname::THIS
  잘된 방법 : classname::THIS


 warning C4251: 'STL ObjectName' : class 'std::vector<_Ty>'에서는 class 'ExportClassName'의 클라이언트에서 DLL 인터페이스를 사용하도록 지정해야 합니다.

 이 경구 메세지는 STL 컨테이너 정의에 _declspec(dllexport) 선언이 되어있지 않은 클래스템플릿을 export 할시에 나타나는 경고입니다. 제가 알기론 두세가지의 해결법이 있는데 일반적으론 이 warning을 무시한다고 합니다.

 - 해결 방법
vector의 경우엔 템플릿을 인스턴트화 시킨 후 사용하면 해결이 된다고 하지만 다른 컨테이너들은 안된다고 하네요.
 vector 해결법 : template class __declspec(dllexport) std::vector<Type>;

그 이외엔 #pragma warning(disable : 4251) 로 무시하고 사용하시면 됩니다.