Visual C++의 주요 변경 사항

이 문서에서는 Visual C++ 2010의 주요 변경 사항을 보여 줍니다.

Visual C++ 컴파일러

  • auto 키워드에 새 기본 의미가 추가되었습니다. 이전 의미는 거의 사용되지 않으므로 대부분의 응용 프로그램에서는 이 변경 내용의 영향을 받지 않습니다.

  • static_assert 키워드가 도입되었으므로 사용자 코드에 해당 이름을 사용하는 식별자가 이미 있는 경우 이름 충돌이 발생합니다.

  • 새 람다 표기법에서는 IDL uuid 특성에 따옴표가 없는 GUID를 코딩하는 기능 지원이 제외되었습니다.

  • .NET Framework 4에서는 손상된 상태 예외라는 개념이 도입되었으며 이 예외는 프로세스를 복구할 수 없는 손상된 상태로 둡니다. 기본적으로 손상된 상태 예외는 catch할 수 없으며 다른 모든 예외를 catch하는 /EHa 컴파일러 옵션을 사용하더라도 catch할 수 없습니다.

    손상된 상태 예외를 명시적으로 catch하려면 __try-__except 문을 사용하십시오. 또는 함수에서 손상된 상태 예외를 catch할 수 있도록 [HandledProcessCorruptedStateExceptions] 특성을 적용하십시오.

    이 변경 내용은 손상된 상태 예외를 catch해야 하는 시스템 프로그래머에게 주로 영향을 줍니다. 이러한 예외로는 STATUS_ACCESS_VIOLATION, STATUS_STACK_OVERFLOW, EXCEPTION_ILLEGAL_INSTRUCTION, EXCEPTION_IN_PAGE_ERROR, EXCEPTION_INVALID_DISPOSITION, EXCEPTION_NONCONTINUABLE_EXCEPTION, EXCEPTION_PRIV_INSTRUCTION, STATUS_UNWIND_CONSOLIDATE 등의 8가지 예외가 있습니다. 이러한 예외에 대한 자세한 내용은 GetExceptionCode 매크로를 참조하십시오.

  • 수정된 /GS 컴파일러 옵션에서는 이전 버전에 비해 좀 더 포괄적으로 버퍼 오버런을 방지합니다. 이 버전은 스택에 추가 보안 검사를 삽입하므로 성능이 저하될 수 있습니다. 새 __declspec(safebuffers) 키워드를 사용하여 컴파일러에서 특정 함수에 대한 보안 검사를 삽입하지 않도록 지시할 수 있습니다.

  • /GL(전체 프로그램 최적화)/clr(공용 언어 런타임 컴파일) 컴파일러 옵션을 함께 사용하여 컴파일할 경우 /GL 옵션이 무시됩니다. 제공된 컴파일 옵션을 조합해도 장점이 별로 없으므로 이와 같이 변경되었습니다. 이와 같은 변경 내용에 따라 빌드 성능이 향상되었습니다.

  • 기본적으로 삼중자는 Visual C++ 2010 에서 지원되지 않습니다. 삼중자 지원을 활성화하려면 /Zc:trigraphs 컴파일러 옵션을 사용합니다. 삼중자는 연속되는 두 개의 물음표(??)와 물음표 이외의 세 번째 문자로 이루어집니다. 컴파일러에서는 삼중자를 상응하는 문장 부호 문자로 바꿉니다. 예를 들어, 컴파일러는 ??= 삼중자를 # 문자로 바꿉니다. 삼중자는 특정 문장 부호 문자에 대한 편리한 그래픽 표현을 포함하지 않는 문자 집합이 사용되는 C 소스 파일에서 사용합니다.

  • 링커에서는 Windows 98에 대한 최적화를 더 이상 지원하지 않습니다. /OPT:WIN98 또는 /OPT:NOWIN98을 지정한 경우에는 /OPT(최적화) 옵션에서 컴파일 타임 오류가 발생합니다.

  • RuntimeLibraryDebugInformationFormat 빌드 시스템 속성에서 지정되는 기본 컴파일러 옵션이 변경되었습니다. 기본적으로 이러한 빌드 속성은 Visual C++ 릴리스 7.0 ~ 10.0에서 만든 프로젝트에 지정됩니다. Visual C++ 6.0에서 만든 프로젝트를 마이그레이션하는 경우 이러한 속성의 값을 지정할지 여부를 고려해야 합니다.

    Visual C++ 2010에서 RuntimeLibraryMultiThreaded (/MD), DebugInformationFormat은 **ProgramDatabase (/Zi)**입니다. Visual C++ 9.0에서 RuntimeLibraryMultiThreaded (/MT), DebugInformationFormatDisabled입니다.

CLR(공용 언어 런타임)

  • Microsoft C# 및 Visual Basic 컴파일러에서는 이제 no-PIA(비 주 interop 어셈블리)를 생성할 수 있습니다. no-PIA 어셈블리에서는 관련 PIA(주 interop 어셈블리)를 배포하지 않고도 COM 형식을 사용할 수 있습니다. Visual C# 또는 Visual Basic에서 생성된 no-PIA 어셈블리를 사용할 경우에는 해당 라이브러리를 사용하는 no-PIA 어셈블리를 참조하기 전에 컴파일 명령에서 PIA 어셈블리를 참조해야 합니다.

Visual C++ 프로젝트 및 MSBuild

  • Visual C++ 프로젝트는 이제 MSBuild 도구를 기반으로 합니다. 따라서 프로젝트 파일에서는 새 XML 파일 형식 및 .vcxproj 파일 접미사를 사용합니다. 이전 버전의 Visual Studio에서 만든 프로젝트 파일은 Visual C++ 2010에 의해 새로운 파일 형식으로 자동 변환됩니다.

    기존 프로젝트가 이전 빌드 도구인 VCBUILD.exe나 프로젝트 파일 접미사인 .vcproj를 사용하는 경우 영향을 받습니다.

  • 이전 릴리스에서 Visual C++는 속성 시트의 지연 확인을 지원했습니다. 예를 들어 부모 속성 시트는 자식 속성 시트를 가져올 수 있었고 자식에 정의되어 있는 변수를 다른 변수를 정의하는 데 사용할 수 있었습니다. 지연 확인을 통해 부모는 자식 속성 시트를 가져오기 전에도 자식 변수를 사용할 수 있습니다. MSBuild에서는 조기 확인만 지원하기 때문에 Visual C++ 2010에서 프로젝트 시트 변수는 정의되기 이전에 사용할 수 없습니다.

IDE

  • 응용 프로그램 종료 대화 상자에서 더 이상 응용 프로그램이 종료되지 않습니다.

    이전 릴리스에서는 abort() 또는 terminate() 함수가 응용 프로그램의 정식 버전 빌드를 닫을 때 C 런타임 라이브러리가 콘솔 창이나 대화 상자에 응용 프로그램 종료 메시지를 표시했습니다. 다음과 같은 메시지가 표시되었습니다. "이 응용 프로그램에서 비정상적인 종료를 런타임에 요청했습니다. 자세한 내용은 해당 응용 프로그램 지원 팀에 문의하십시오."

    Windows에 현재 종료 처리기(일반적으로 Windows 오류 보고(Dr. Watson) 대화 상자 또는 Visual Studio 디버거)가 이어서 표시되어 응용 프로그램 종료 메시지가 중복되었습니다. Visual Studio 2010부터는 C 런타임 라이브러리가 메시지를 표시하지 않습니다. 또한 디버거가 시작되기 전에 런타임에서 응용 프로그램이 종료되지 않도록 합니다.

    이는 응용 프로그램 종료 메시지의 이전 동작에 종속된 경우에만 해당되는 주요 변경 내용입니다.

  • 특히 Visual Studio 2010의 경우 IntelliSense가 C++/CLI 코드 또는 특성에 대해 작동하지 않고, 모든 참조 찾기가 지역 변수에 대해 작동하지 않으며, 코드 모델은 가져온 어셈블리에서 형식 이름을 검색하지 않거나 형식을 정규화된 이름으로 확인하지 않습니다.

Visual C++ 라이브러리

  • SafeInt 클래스는 Visual C++에 포함되었으므로 더 이상 별도의 다운로드로 제공되지 않습니다. 이는 "SafeInt"라는 클래스를 개발해 놓은 경우에만 주요 변경 내용입니다.

  • 라이브러리 배포 모델은 더 이상 매니페스트를 사용하여 특정 버전의 동적 연결 라이브러리를 찾지 않습니다. 대신 각 동적 연결 라이브러리의 이름에 해당 버전 번호가 포함되므로 해당 이름을 사용하여 라이브러리를 찾을 수 있습니다. 자세한 내용은 Visual C++ 2010에서의 배포를 참조하십시오.

  • 이전 버전의 Visual Studio에서는 런타임 라이브러리를 다시 빌드할 수 있었습니다. Visual C++ 2010에서는 더 이상 C 런타임 라이브러리 파일의 고유 복사본을 빌드할 수 없습니다.

표준 템플릿 라이브러리

  • <iterator> 헤더는 더 이상 다른 많은 헤더 파일에 자동으로 포함되지 않습니다. 대신 <interator> 헤더에 정의된 독립 실행형 반복기에 대한 지원이 필요하면 해당 헤더를 명시적으로 포함하십시오.

  • <algorithm> 헤더에서 checked_* 및 unchecked_* 함수가 제거되었습니다. 또한 <iterator> 헤더에서는 checked_iterator 클래스가 제거되고 unchecked_array_iterator 클래스가 추가되었습니다.

  • CComPtr::CComPtr(int) 생성자는 제거되었습니다. 이 생성자는 NULL 매크로를 통해 CComPtr 개체가 생성되도록 허용했지만 불필요할 뿐 아니라 0이 아닌 정수로도 개체를 생성할 수 있게 허용하는 큰 문제점이 있었습니다.

    CComPtr은 이전과 마찬가지로 NULL(0으로 정의됨)로부터 생성될 수 있지만 리터럴 0이 아닌 정수로부터 생성될 경우 실패하게 됩니다. 이 문제는 다음 의사(pseudo) 코드로 기술된 상황에서 발생할 가능성이 매우 높습니다.

    pair<X, CComPtr<T>> myVar;
    myVar = make_pair(x, NULL);
    

    두 번째 문을 수정하려면 NULL 매크로 대신 nullptr 키워드를 사용합니다.

    myVar = make_pair(x, nullptr)
    
  • ctype의 멤버 함수 ctype::_Do_narrow_s, ctype::_Do_widen_s, ctype::_narrow_s, ctype::_widen_s가 제거되었습니다. 응용 프로그램에서 이러한 멤버 함수 중 하나가 사용되면 해당 함수를 상응하는 비보안 버전(ctype::do_narrow, ctype::do_widen, ctype::narrow, ctype::widen)으로 바꿔야 합니다.

CRT, MFC 및 ATL 라이브러리

  • 사용자가 CRT, MFC 및 ATL 라이브러리를 빌드하는 데 필요한 지원이 제거되었습니다. 예를 들어, 적절한 nmake 파일이 제공되지 않습니다. 하지만 사용자는 계속해서 이러한 라이브러리의 소스 코드에 액세스할 수 있습니다. 그리고 Microsoft에서 이러한 라이브러리를 빌드하는 데 사용한 MSBuild 옵션을 설명하는 문서가 Visual C++ 팀 블로그에 게시될 예정입니다.

  • IA64에 대한 MFC 지원이 제거되었습니다. 그러나 IA64에 대한 CRT 및 ATL 지원은 계속 제공됩니다.

  • 서수는 MFC 모듈 정의(.def) 파일에서 더 이상 재사용되지 않습니다. 이 변경 내용은 서수가 부 버전 간에 다르지 않으므로 서비스 팩과 QFE(quick fix engineering) 버전의 이진 호환성이 향상된다는 것을 의미합니다.

  • CDocTemplate 클래스에 새 가상 함수가 추가되었습니다. 이 새 가상 함수는 CDocTemplate::OpenDocumentFile입니다. 이전 버전의 OpenDocumentFile에는 두 개의 매개 변수가 있었지만, 새 버전에는 세 개의 매개 변수가 있습니다. 다시 시작 관리자를 지원하려면 CDocTemplate에서 파생된 클래스에서 세 개의 매개 변수를 포함하는 버전을 구현해야 합니다. 함수에 대한 자세한 내용은 CDocTemplate::OpenDocumentFile을 참조하십시오. 새 매개 변수는 bAddToMRU입니다.

매크로 및 환경 변수

  • 환경 변수 __MSVCRT_HEAP_SELECT가 더 이상 지원되지 않습니다. 이 환경 변수는 제거되었으며 대체 변수도 없습니다.

Microsoft 매크로 어셈블러 참조

참고 항목

기타 리소스

Visual C++ 2010 시작