메뉴 건너뛰기


Developer > Development Tools


출처: http://1and0.tistory.com/entry/VS2005MigrationCRT


기존의 VS6 프로젝트를 VS2005로 마이그레이션 할 경우 몇 가지 warning에 부딪힐 수 있다.
경험한 몇가지를 예를 들자면,

1. For 문의 지역 변수 스코프

for ( int i=0; i<3; i++ )
{
    // 처리 코드
}

for ( i=0; i<10; i++ )
{
    // 처리 코드
}

VS6에서는 이와 같은 코드가 정상적으로 작동했으나 VS2005이상에서는 정상적으로 작동하지 않는다. 이는 표준을 준수하는 것으로 for 문 내부에서만 i 변수의 스코프가 유효하도록 수정되었기 때문이다.
이 경우는 왠만하면 표준을 준수하도록 고쳐 주는 것이 좋으며 그렇지 않을 경우에는 프로젝트 속성-구성 속성-C/C++-언어에 보면 for 루프 범위 강제 규칙이라는 항목이 기본 "예"로 되어 있는데 이른 "아니오"로 설정하면 그대로 사용이 가능하다.

2.  warning C4996
VS2005 부터는 CRT 라이브러리 함수의 문자열 다루는 함수의 안정성에 많이 신경을 쓴다. 그래서 기존의 문자열 함수에 _s를 붙여서 버퍼의 길이를 지정하도록 권장하고 있는데 이것 때문에 기존의 strcpy 같은 문자열 함수에서 C4996 warning 가 발생한다. warning 내용을 보면 아래와 유사하다.

warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

이를 경우에도 권장하는 바를 따르는 것이 일단 좋다고 생각되나 그런 환경이 되지 않을 경우에는 적혀 있는대로 <stdafx.h> 파일 상단에 

#define _CRT_SECURE_NO_WARNINGS

를 정의해 주거나 

#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES     1

를 정의해 줘도 된다.
그리고 또 한가지 

#define _CRT_SECURE_NO_DEPRECATE

를 정의해 줘도 된다.

3. warning C4996
그리고 같은 4996 에러로서 아래와 같은 warning 이 날 수도 있다.

warning C4996: 'stricmp': The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: _stricmp. See online help for details.

이를 경우에는 <stdafx.h> 파일 상단에 

#define _CRT_NONSTDC_NO_DEPRECATE

를 정의해 주면 된다.

4. warning C4995
4995 에러는 #pragma deprecated 로 지정된 함수를 사용하면 warning 이 나는데 에러 내용을 보면 아래와 같다.

warning C4995: 'wsprintf': 이름이 #pragma deprecated로 표시되었습니다.

이 해결책을 MSDN에 보면 

#pragma warning(disable : 4995)

를 주면 이 경고를 해제할 수 있다고 나와 있다.
그리고 또 다른 방법으로는 역씨 define 문을 사용할 수 있는데

#define STRSAFE_NO_DEPRECATE

을 사용하면 경고를 없앨 수 있다.