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++ 라이브러리
병렬 패턴 라이브러리 및 동시성 런타임 라이브러리
SchedulerType 열거형의 UmsThreadDefault 는 사용 되지 않습니다.사양 UmsThreadDefault 사용 되지 않는 경고를 생성 하 고 내부적으로 다시 매핑되는 ThreadScheduler.
표준 템플릿 라이브러리
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().
CRT 라이브러리
사용 되는 CRT (C 런타임) 힙, new 및 malloc(), 더 이상 개인입니다.CRT는 이제 프로세스 힙을 사용합니다.따라서 DLL이 로드 될 때 힙이 소멸, CRT에 정적으로 링크 되는 Dll에서 할당 된 메모리를 확인 해야 하므로 언로드 되었습니다 전에 DLL 코드 정리 합니다.
iscsymf() 함수를 음수 값으로 어설션 합니다.
threadlocaleinfostruct 구조체 로캘 함수 변경 내용을 수용 하기 위해 변경 되었습니다.
해당 내장 같은 CRT 함수 memxxx(), strxxx() 제거 됩니다 intrin.h.포함 하는 경우 intrin.h 이러한 함수에 대 한 지금 해당 CRT 헤더를 포함 해야 합니다.
MFC 및 ATL 라이브러리
제거 퓨전 (afxcomctl32.h). 따라서 afxcomctl32.h에 정의 된 모든 메서드가 제거 되었습니다.헤더 파일 afxcomctl32.h 및 afxcomctl32.inl 삭제 되었습니다.
이름이 변경 CDockablePane::RemoveFromDefaultPaneDividier 에 CDockablePane::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).
CRichEditCtrl및 CRichEditView 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::DwmIsCompositionEnabled 에 IsDwmCompositionEnabled 이름 충돌을 제거 합니다.
식별자를 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
내부 메서드는 이름이 FontFamalyProcFonts 에 FontFamilyProcFonts.
여러 전역 정적 제거 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_bCaptionText 및 m_bHideDisabledButtons.
오버라이드가 추가 DeleteString 메서드에 CMFCFontComboBox.
사용 되지 않는 메서드를 제거 CPane: GetMinLength 및 IsLastPaneOnLastRow.
Renamed CPane::GetDockSiteRow(CDockingPanesRow *) to CPane::SetDockSiteRow.