다음을 통해 공유


Visual C++의 주요 변경 사항

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

Visual C++ 컴파일러

  • In code that's compiled by using /clr, the enum class keyword defines a C++11 enum, not a common language runtime (CLR) enum.To define a CLR enum, you must be explicit about its accessibility.다음 예제에서는 이 작업을 보여 줍니다.

    enum class ArrivalStatus // C++11 scoped enum
    {
        Late, OnTime, Early
    };
    
    private enum class DepartureStatus // CLR enum (because of explicit accessibility)
    {
        Late, OnTime, Early
    };
    
    void PrintStatus(ArrivalStatus arrival, DepartureStatus departure)
    {
        Console.WriteLine("Departure: {0}, Arrival: {1}", 
            departure.ToString(), 
            arrival.ToString() // ERROR: not a CLR enum; does not support .ToString()
            );
    } 
    
  • Use the template keyword to explicitly disambiguate a dependent name (C++ Language Standard compliance).In the following example, the highlighted template keyword is mandatory to resolve the ambiguity.자세한 내용은 종속적인 형식에 대 한 이름 확인을 참조하십시오.

    template <typename X, typename AY> struct Container {
        typedef typename AY::template Rebind<X>::Other AX;
    };
    
  • Constant expression of type float is no longer allowed as a template argument, as shown in the following example.

    template<float n>
    struct B {};  // error C2762: 'float': illegal type for non-type template parameter 'n'
    
    template<int n>
    struct A {};
    
    A<1.1> a1; // error C2762: 'A': invalid expression as a template argument for 'n'
    A<(int)1.1> a2; // ok
    
  • Code that's compiled by using the /GS command-line option and that has an off-by-one vulnerability may lead to process termination at runtime, as shown in the following pseudocode example.

    char buf[MAX];
    int cch;
    ManipulateString(buf, &cch);
    // ...
    buf[cch] = '\0'; // if cch >= MAX, process will terminate
    
  • The default architecture for x86 builds is changed to SSE2; therefore, the compiler may emit SSE instructions, and will use the XMM registers to perform floating-point calculations. If you want to revert to previous behavior, then use the /arch:IA32 compiler flag to specify the architecture as IA32.

  • 컴파일러 경고 C4703 및 여기서 이전에 제대로 작동 되지 않으며 C4701 발행 해도 됩니다. 컴파일러는 포인터 형식의 초기화 되지 않은 지역 변수 사용에 대 한 강력한 확인 적용 됩니다.

  • 때 새로운 링커 플래그 /HIGHENTROPYVA 지정 된 Windows 8 일반적으로 64 비트 주소를 반환 하는 메모리 할당이 발생 합니다.(이전에 Windows 8에서 이러한 할당이 더 자주 2 GB 미만인 있던 주소를 반환 합니다.) 이 포인터 잘라내기 버그 기존 코드에 노출 될 수 있습니다. 기본적으로이 스위치가 켜져 있습니다. 이 동작을 해제 하려면 지정 /HIGHENTROPYVA:NO.

  • 관리 되는 컴파일러 (Visual Basic / C#)도 지원 /HIGHENTROPYVA 빌드를 관리 합니다.그러나이 경우에에서는 /HIGHENTROPYVA 스위치 기본적으로 꺼져 있습니다.

IDE

  • 다음과 같은 프로젝트 템플릿을 더 이상 존재 합니다.

    • Windows Forms 응용 프로그램

    • Windows Forms 컨트롤 라이브러리

  • 에서는 Windows Forms 응용 프로그램에서 C + 만들지 않는 것이 좋습니다 있지만 + CLI를 유지 하는 기존 C + + CLI UI 응용 프로그램에서 지원 됩니다.다른.NET UI 응용 프로그램 또는 Windows Forms 응용 프로그램을 작성 하는 경우 C# 또는 Visual Basic 사용 합니다.사용 하 여 C + + CLI 상호 운용성을 위한 목적 으로만 사용 합니다.

Visual C++ 라이브러리

Bb531344.collapse_all(ko-kr,VS.110).gif병렬 패턴 라이브러리 및 동시성 런타임 라이브러리

SchedulerType 열거형의 UmsThreadDefault 는 사용 되지 않습니다.사양 UmsThreadDefault 사용 되지 않는 경고를 생성 하 고 내부적으로 다시 매핑되는 ThreadScheduler.

Bb531344.collapse_all(ko-kr,VS.110).gif표준 템플릿 라이브러리

  • C 간의 주요 변경 다음 + + 98/03과 C + + 11 표준, 명시적 템플릿 인수를 사용 하 여 make_pair()-in make_pair<int, int>(x, y)-일반적으로 컴파일되지 않습니다. Visual Studio 2012의 Visual C++.항상 호출 하는 것이 솔루션 make_pair() 명시적 템플릿 인수를 사용 하지 않고-in make_pair(x, y).명시적 템플릿 인수 비교 목적 함수를 제공합니다.결과 형식이 정확 하 게 제어 해야 하는 경우 사용 pair 대신 make_pair-in pair<short, short>(int1, int2).

  • C 사이의 또 다른 주요 변경 + + 98/03과 C + + 11 표준: A에 암시적으로 변환 될 때 B와 B는 C로 암시적으로 변환할 수 있지만 A C C로 암시적으로 변환 될 수 없습니다 + + 98/03 및 Visual C++ 2010 허용 pair<A, X> (암시적 또는 명시적)으로 변환 하려면 pair<C, X>.(다른 유형으로, X의 여기에 관심 있는 한 쌍에 있는 첫 번째 형식에 특정 아닙니다 아닙니다.) 때문에 C + + 11 및 Visual Studio 2012의 Visual C++ A C로 암시적으로 변환할 수 없습니다, 이러한 오버 로드 확인에서 쌍 변환을 제거를 검색 합니다.이 대부분의 시나리오에 대 한 긍정적인 변화입니다.예를 들어, 오버 로드 func(const pair<int, int>&) 및 func(const pair<string, string>&)를 호출 하 고 func() 와 pair<const char *, const char *> 이 변경으로 컴파일되지 것입니다.그러나이 이렇게 적극적인 쌍 변환에 의존 하는 코드가 중단 됩니다.일반적으로 명시적으로 변환의 한 부분을 수행 하 여 이러한 코드를 수정할 수, 즉 전달 하 여 예를 들어, make_pair(static_cast<B>(a), x) 필요한 함수에 pair<C, X>.

  • Visual C++ 2010시뮬레이션 variadic 템플릿 — 예를 들어, make_shared<T>(arg1, arg2, argN)-까지 오버 로드 및 특수화를 전처리기 기계를 스탬핑 하 여 10 개의 인수가 있습니다.Visual Studio 2012의 Visual C++, 컴파일 시간 및 대부분의 사용자에 대 한 컴파일러 메모리 소비를 향상 시키기 위해 5 인수이 제한이 감소 됩니다.그러나 명시적으로 정의 하 여 이전 제한을 설정할 수 있습니다 _VARIADIC_MAX 10으로 전체 프로젝트.

  • C + + 11 17.6.4.3.1 [매크로입니다.이름] / 2 c + + 표준 라이브러리 헤더에 포함 되어 있는 경우 매크로 izing 키워드를 금지 합니다.헤더는 키워드 매크로 부분을 발견 하면 이제 컴파일러 오류를 내보냅니다.(정의 _ALLOW_KEYWORD_MACROS 이런 코드를 컴파일하려면 허용 하지만 우리가 강력 하 게 그 사용을 방지 하기.) 예외로, 매크로 부분 new 헤더를 포괄적으로 자신을 사용 하 여 방어 하기 때문에 기본적으로 사용할 수 있습니다 #pragma push_macro("new")/#undef new/#pragma pop_macro("new").정의 _ENFORCE_BAN_OF_MACRO_NEW 정확히 어떤 이름이 암시 하지.

  • 다양 한 최적화 및 디버깅 검사를 구현 하는 c + + 표준 라이브러리 구현 의도적으로 Visual Studio 버전 간의 이진 호환성 중단 (2005, 2008, 2010, 2012).C + + 표준 라이브러리를 사용 하는 경우 하나의 바이너리 (EXE 또는 DLL)에 서로 다른 버전을 사용 하 여 컴파일하고 c + + 표준 라이브러리 개체를 전달 하는 간에 서로 다른 버전을 사용 하 여 컴파일된 이진 파일을 금지 하는 정적 라이브러리 및 개체 파일의 혼합 금지 되어 있습니다.혼합 개체 파일을 사용 하 여 컴파일된 정적 라이브러리 (c + + 표준 라이브러리 사용) Visual C++ 2010 을 사용 하 여 컴파일된 Visual Studio 2012의 Visual C++ 링커 오류에 대 한 방출 _MSC_VER 불일치 위치 _MSC_VER 컴파일러의 주 버전에 포함 된 매크로입니다 (1700에 대 한 Visual Studio 2012의 Visual C++).이 검사 혼합 DLL을 검색할 수 없습니다 및 혼합 하는 것을 감지할 수 없습니다 Visual C++ 2008 이전 버전입니다.

  • 검색 외에도 _ITERATOR_DEBUG_LEVEL 에 구현 된 불일치 Visual C++ 2010, Visual Studio 2012의 Visual C++ 단 불일치를 찾습니다.발생 하면 컴파일러 옵션 /MT (정적 릴리스) /MTd (정적 디버그) /MD (동적 릴리스) 및 /MDd (동적 디버그) 혼합.

  • operator<()operator>(), operator<=(), 및 operator>=() 이전에 사용할 수 있는 것은 std::unordered_map 및 stdext::hash_map 제품군의 컨테이너 구현 실제로 유용 하지는 못했지만.이러한 표준이 아닌 연산자에 제거 된 Visual Studio 2012의 Visual C++.또한 구현의 operator==() 및 operator!=() 에 std::unordered_map 제품군 포함 하도록 확장 되었습니다의 stdext::hash_map 제품군.(사용을 하지 않는 것이 좋습니다 있는 stdext::hash_map 제품군에 새 코드입니다.)

  • C + + 11 22.4.1.4 [locale.codecvt]를 지정 하는 codecvt::length() 및 codecvt::do_length() 수정할 수 취해야 stateT& 매개 변수를 있지만 Visual C++ 2010 걸린 const stateT&.Visual Studio 2012의 Visual C++사용 stateT& 표준에서 요구 하는 것입니다.가상 함수를 재정의 하려고 하는 누구에 대 한 중요 한 차이가이 do_length().

Bb531344.collapse_all(ko-kr,VS.110).gifCRT 라이브러리

  • 사용 되는 CRT (C 런타임) 힙, new 및 malloc(), 더 이상 개인입니다.CRT는 이제 프로세스 힙을 사용합니다.따라서 DLL이 로드 될 때 힙이 소멸, CRT에 정적으로 링크 되는 Dll에서 할당 된 메모리를 확인 해야 하므로 언로드 되었습니다 전에 DLL 코드 정리 합니다.

  • iscsymf() 함수를 음수 값으로 어설션 합니다.

  • threadlocaleinfostruct 구조체 로캘 함수 변경 내용을 수용 하기 위해 변경 되었습니다.

  • 해당 내장 같은 CRT 함수 memxxx(), strxxx() 제거 됩니다 intrin.h.포함 하는 경우 intrin.h 이러한 함수에 대 한 지금 해당 CRT 헤더를 포함 해야 합니다.

Bb531344.collapse_all(ko-kr,VS.110).gifMFC 및 ATL 라이브러리

제거 퓨전 (afxcomctl32.h). 따라서 afxcomctl32.h에 정의 된 모든 메서드가 제거 되었습니다.헤더 파일 afxcomctl32.h 및 afxcomctl32.inl 삭제 되었습니다.

이름이 변경 CDockablePane::RemoveFromDefaultPaneDividierCDockablePane::RemoveFromDefaultPaneDivider.

시그니처 변경 CFileDialog::SetDefExt ; LPCTSTR을 사용 하려면 따라서 유니코드 빌드의 영향을 받습니다.

사용 되지 않는 ATL 추적 범주를 제거 합니다.

시그니처 변경 CBasePane::MoveWindow 상수는 데 CRect.

시그니처 변경 CMFCEditBrowseCtrl::EnableBrowseButton.

Removed m_fntTabs and m_fntTabsBold from CMFCBaseTabCtrl.

매개 변수를 추가 된 CMFCRibbonStatusBarPane 생성자입니다.(기본 같습니다 및 등 주요 소스 아닙니다)

매개 변수를 추가 된 CMFCRibbonCommandsListBox 생성자입니다.(기본 같습니다 및 등 주요 소스 아닙니다)

제거는 AFXTrackMouse API (및 관련된 타이머 프로시저).Win32 사용 하 여 TrackMouseEvent API 대신 합니다.

매개 변수를 추가 된 CFolderPickerDialog 생성자입니다.(기본 같습니다 및 등 주요 소스 아닙니다)

CFileStatus구조체의 크기를 변경:의 m_attribute 멤버는 DWORD 바이트를 변경 (에서 반환 되는 값과 일치 하도록 GetFileAttributes).

CRichEditCtrlCRichEditView MSFTEDIT_CLASS (4.1 RichEdit 컨트롤) RICHEDIT_CLASS (RichEdit 3.0 컨트롤) 대신 유니코드 빌드에서 사용 합니다.

제거 AFX_GLOBAL_DATA::IsWindowsThemingDrawParentBackground Windows Vista, Windows 7 및 Windows 8에서 TRUE 이기 때문에.

제거 AFX_GLOBAL_DATA::IsWindowsLayerSupportAvailable Windows Vista, Windows 7 및 Windows 8에서 TRUE 이기 때문에.

Removed AFX_GLOBAL_DATA::DwmExtendFrameIntoClientArea.Windows API는 Windows Vista에서 직접, Windows 7 및 Windows 8 호출 합니다.

Removed AFX_GLOBAL_DATA::DwmDefWindowProc.Windows API는 Windows Vista에서 직접, Windows 7 및 Windows 8 호출 합니다.

이름이 AFX_GLOBAL_DATA::DwmIsCompositionEnabledIsDwmCompositionEnabled 이름 충돌을 제거 합니다.

식별자를 MFC 내부 타이머의 번호를 변경 하 고 afxres.h에 정의 이동 (AFX_TIMER_ID_*).

시그니처 변경 OnExitSizeMove ON_WM_EXITSIZEMOVE 매크로 사용 하는 메서드.

  • CFrameWndEx

  • CMDIFrameWndEx

  • CPaneFrameWnd

이름 및 시그니처를 변경 OnDWMCompositionChanged ON_WM_DWMCOMPOSITIONCHANGED 매크로 사용 하 여 동의 합니다.

  • CFrameWndEx

  • CMDIFrameWndEx

  • CPaneFrameWnd

시그니처 변경 OnMouseLeave ON_WM_MOUSELEAVE 매크로 사용 하는 메서드.

  • CMFCCaptionBar

  • CMFCColorBar

  • CMFCHeaderCtrl

  • CMFCProperySheetListBox

  • CMFCRibbonBar

  • CMFCRibbonPanelMenuBar

  • CMFCRibbonRichEditCtrl

  • CMFCSpinButtonCtrl

  • CMFCToolBar ReplaceThisText

  • CMFCToolBarComboBoxEdit

  • CMFCToolBarEditCtrl

  • CMFCAutoHideBar

시그니처를 변경 OnPowerBroadcast ON_WM_POWERBROADCAST 매크로 사용 하 여 동의 합니다.

  • CFrameWndEx

  • CMDIFrameWndEx

시그니처를 변경 OnStyleChanged ON_WM_STYLECHANGED 매크로 사용 하 여 동의 합니다.

  • CMFCListCtrl

  • CMFCStatusBar

내부 메서드는 이름이 FontFamalyProcFontsFontFamilyProcFonts.

여러 전역 정적 제거 CString 누수 일부 상황에서 메모리를 제거 하려면 개체 (대체 # 정의), 및 다음 클래스 멤버 변수:

  • CKeyBoardManager::m_strDelimiter

  • CMFCPropertyGridProperty::m_strFormatChar

  • CMFCPropertyGridProperty::m_strFormatShort

  • CMFCPropertyGridProperty::m_strFormatLong

  • CMFCPropertyGridProperty::m_strFormatUShort

  • CMFCPropertyGridProperty::m_strFormatULong

  • CMFCPropertyGridProperty::m_strFormatFloat

  • CMFCPropertyGridProperty::m_strFormatDouble

  • CMFCToolBarImages::m_strPngResType

  • CMFCPropertyGridProperty::m_strFormat

시그니처를 변경 CKeyboardManager::ShowAllAccelerators 및 가속기 구분 매개 변수를 제거 합니다.

추가 CPropertyPage::GetParentSheet, 및는 CPropertyPage 클래스를 대신 호출 GetParent 부모 수 올바른 부모 시트 창 나 최상위 창에 CPropertyPage.호출 하도록 코드를 변경 할 수 있습니다 GetParentSheet 대신 GetParent.

불균형된 #pragma warning(push) ATLBASE에서 해결 되었습니다.H, 제대로 사용 하지 않을 경고를 발생 합니다.이제 이러한 경고 후 ATLBASE 제대로 활성화 됩니다.H 구문 분석 되었으면 합니다.

D2D 관련 메서드를 이동 AFX_GLOBAL_DATA_AFX_D2D_STATE.

  • GetDirectD2dFactory

  • GetWriteFactory

  • GetWICFactory

  • InitD2D

  • ReleaseD2DRefs

  • IsD2DInitialized

  • D2D1MakeRotateMatrix

  • 예를 들어, 호출 하는 대신 afxGlobalData.IsD2DInitialized, 호출 AfxGetD2DState->IsD2DInitialized.

사용 되지 않는 ATL * 제거 합니다.CPP 파일에서 \atlmfc\include\ 폴더입니다.

이동 afxGlobalData 주문형 대신 DLLMain 요구 사항을 만족 시키는 CRT 초기화 시에 초기화 됩니다.

추가 된 RemoveButtonByIndex 메서드에 CMFCOutlookBarPane 클래스.

Corrected CMFCCmdUsageCount::IsFreqeuntlyUsedCmd to IsFrequentlyUsedCmd.

Corrected several instances of RestoreOriginalstate to RestoreOriginalState (CMFCToolBar, CMFCMenuBar, CMFCOutlookBarPane).

Removed unused methods from CDockablePane: SetCaptionStyle, IsDrawCaption, IsHideDisabledButtons, GetRecentSiblingPaneInfo, and CanAdjustLayout.

제거 CDockablePane 정적 멤버 변수 m_bCaptionTextm_bHideDisabledButtons.

오버라이드가 추가 DeleteString 메서드에 CMFCFontComboBox.

사용 되지 않는 메서드를 제거 CPane: GetMinLengthIsLastPaneOnLastRow.

Renamed CPane::GetDockSiteRow(CDockingPanesRow *) to CPane::SetDockSiteRow.

참고 항목

기타 리소스

Visual Studio 2012 RC의 Visual C++ 시작