Visual C++ 的重大變更
本文件列出 Visual Studio 2012 中的 Visual C++ 中的重大變更。
Visual C++ 編譯器
使用 /clr,以編譯的程式碼中, enum class 關鍵字定義 C++. ++11 列舉,而不是 Common Language Runtime (CLR) 列舉。 若要定義 CLR 列舉,您必須是明確的相關存取範圍。 以下範例就是示範這項作業。
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() ); }
使用 template 關鍵字明確釐清相依名稱 (C++ 語言標準相容)。 在下列範例中,反白顯示的範本關鍵字是必須解決語意模糊。 如需詳細資訊,請參閱名稱解析的相依型別。
template <typename X, typename AY> struct Container { typedef typename AY::template Rebind<X>::Other AX; };
如下列範例所示,型別 float 常數運算式不再允許做為樣板引數。
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
如下列虛擬程式碼範例所示,編譯的程式碼使用 /GS 命令列選項和有由程式碼可能會導致終止處理序中的執行階段,。
char buf[MAX]; int cch; ManipulateString(buf, &cch); // ... buf[cch] = '\0'; // if cch >= MAX, process will terminate
x86 組建的預設結構變更為 SSE2;因此,編譯器可能會發出 SSE 指令和使用 XMM 暫存器執行浮點計算。如果您想要將還原成之前的行為,請使用 /arch:IA32 編譯器旗標指定結構做為 IA32。
編譯器可能會發出先前沒有的警告 C4703 和 C4701。編譯器應用程式更強的檢查指標型別的未初始化的區域變數的用途。
當新的連結器旗標指定 /HIGHENTROPYVA 時, Windows 8 通常會導致記憶體配置傳回一個 64 位元位址。 (在 Windows 8中,小於 2 GB)。這種配置通常傳回的位址之前這可能會公開指標攔截 Bug 現有程式碼。根據預設,這個參數為。若要停用這個行為,請指定 /HIGHENTROPYVA:NO。
Managed 編譯器 (Visual Basic /C#) 也支援 Managed 組建的 /HIGHENTROPYVA 。 根據預設,不過在這種情況下, /HIGHENTROPYVA 參數取消。
整合式開發環境
下列專案範本不存在:
Windows Form 應用程式
Windows Form 控制項程式庫
雖然我們建議您不要建立以 C++/CLI 的 Windows Form 應用程式,現有 C++/CLI UI 應用程式維護支援。 如果您必須建立 Windows Form 應用程式、或任何其他 .NET UI 應用程式、使用 C# 或 Visual Basic。 使用 C++/CLI 只為互通性目的。
Visual C++ 程式庫
平行模式程式庫和並行執行階段程式庫
UmsThreadDefault 的 SchedulerType 列舉型別已被取代。 UmsThreadDefault 的規格產生取代警告和內部對應至 ThreadScheduler。
標準樣板程式庫
在 C++98/03 和 C++11 標準之間的重大變更之後,使用呼叫明確樣板的引數 make_pair()—在 make_pair<int, int>(x, y)—在 Visual Studio 2012 中的 Visual C++通常不會編譯。 方案將永遠呼叫 make_pair() 沒有明確的樣板引數為 make_pair(x, y)。 提供明確樣板引數會使函式的目的。 如果您需要對結果型別的精確控制,請使用 pair 而非 make_pair— pair<short, short>(int1, int2)中。
在 C++98/03 和 C++11 標準之間的另一項重大變更:當可隱含地轉換為 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 [巨集。 表示 C++ 標準程式庫標頭名稱/值組時,名稱]/2 禁止巨集 izing 關鍵字。 如果它們偵測巨集 ized 關鍵字,標題現在發出編譯器錯誤。 (定義 _ALLOW_KEYWORD_MACROS 允許這類程式碼編譯,,但我們強烈建議不該使用模式)。預設為例外狀況,使用,則為 #pragma push_macro("new")/#undef new/#pragma pop_macro("new"),否則,因為標頭全面地保護自己巨集 ized 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++ 會偵測 RuntimeLibrary 不符。 這些結果,當編譯器選項 /MT (靜態版本) 時, /MTd (靜態偵錯), /MD (動態版本) 和 /MDd (動態偵錯) 混合。
operator<()、 operator>()、 operator<=()和 operator>=() 的容器 std::unordered_map 和 stdext::hash_map 家族是過去的,不過,其實作實際上並不是很有用的。 這些非標準運算子在 Visual Studio 2012 中的 Visual C++中移除。 此外, operator==() 的 std::unordered_map 系列的實作和 operator!=() 擴充包含 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 Library
C 執行階段 (CRT) 堆積,為 new 和 malloc()使用,不再是私用的。 CRT 現在使用管理堆積。 這表示不會終結堆積,當卸載 DLL 時,如此使用 CRT 連接必須以靜態方式確保 DLL、EXE 和 DLL 程式碼配置的記憶體清除,然後卸載之前。
具有負值的 iscsymf() 函式判斷提示。
threadlocaleinfostruct 結構變更容納至地區設定函式的變更。
有對應的性質 (如 memxxx()) 的 CRT 函式, strxxx() 從 intrin.h中移除。 如果您的只包含 intrin.h 這些函式的,現在必須包含對應的 CRT 標頭。
MFC 和 ATL 程式庫。
被移除的融合支援 (afxcomctl32.h);因此,在 afxcomctl32.h 定義移除的所有方法。 標頭檔 afxcomctl32.h 和 afxcomctl32.inl 刪除。
變更 CDockablePane::RemoveFromDefaultPaneDividier 名稱為 CDockablePane::RemoveFromDefaultPaneDivider。
變更 CFileDialog::SetDefExt 簽章使用 LPCTSTR;因此, Unicode 組建受影響。
追蹤分類的過時 ATL。
變更 CBasePane::MoveWindow 簽章接受常數 CRect。
已變更之 CMFCEditBrowseCtrl::EnableBrowseButton簽章。
要移除的 m_fntTabs 和 m_fntTabsBold 從 CMFCBaseTabCtrl。
將參數傳遞給 CMFCRibbonStatusBarPane 建構函式。 (這是預設參數,和,因此無法來源中斷)。
將參數傳遞給 CMFCRibbonCommandsListBox 建構函式。 (這是預設參數,和,因此無法來源中斷)。
移除 AFXTrackMouse 應用程式開發介面 (和相關的計時器處理序)。 使用 Win32 TrackMouseEvent 應用程式開發介面。
將參數傳遞給 CFolderPickerDialog 建構函式。 (這是預設參數,和,因此無法來源中斷)。
CFileStatus 已變更的結構大小: m_attribute 成員位元組變更為 DWORD (與從 GetFileAttributes傳回的值)。
CRichEditCtrl 和 CRichEditView 使用 MSFTEDIT_CLASS (RichEdit 4.1 控制項) 而不是 RICHEDIT_CLASS (RichEdit 3.0 控制項) 在 Unicode 組建。
要移除的 AFX_GLOBAL_DATA::IsWindowsThemingDrawParentBackground ,因為一定是 true 的 Windows Vista、Windows 7 和 Windows 8。
要移除的 AFX_GLOBAL_DATA::IsWindowsLayerSupportAvailable ,因為一定是 true 的 Windows Vista、Windows 7 和 Windows 8。
要移除的 AFX_GLOBAL_DATA::DwmExtendFrameIntoClientArea。 呼叫 Windows API 直接在 Windows Vista、Windows 7 和 Windows 8。
要移除的 AFX_GLOBAL_DATA::DwmDefWindowProc。 呼叫 Windows API 直接在 Windows Vista、Windows 7 和 Windows 8。
對排除名稱衝突的 IsDwmCompositionEnabled 的重新命名的 AFX_GLOBAL_DATA::DwmIsCompositionEnabled 。
已變更的識別碼一些 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 物件消除記憶體遺漏在一些情況中 (以取代 #defines) 和下列類別成員變數:
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 (推入) 在 ATLBASE.H,可使警告不完全停用。 在 ATLBASE.H 剖析之後,這些警告正確現在已啟用。
從 AFX_GLOBAL_DATA 的已移動 D2D 相關的方法加入至 _AFX_D2D_STATE:
GetDirectD2dFactory
GetWriteFactory
GetWICFactory
InitD2D
ReleaseD2DRefs
IsD2DInitialized
D2D1MakeRotateMatrix
而不是呼叫,例如,則為 afxGlobalData.IsD2DInitialized,呼叫 AfxGetD2DState->IsD2DInitialized。
從\ atlmfc \ Include \資料夾中刪除的過時 ATL*.CPP 檔案。
對控制項的已移動 afxGlobalData 初始化而非 CRT 初始化階段, DLLMain 滿足要求。
將 RemoveButtonByIndex 方法加入至 CMFCOutlookBarPane 類別。
為 IsFrequentlyUsedCmd的 CMFCCmdUsageCount::IsFreqeuntlyUsedCmd 。
更正數個 RestoreOriginalstate 執行個體至 RestoreOriginalState (CMFCToolBar、 CMFCMenuBar, CMFCOutlookBarPane)。
從 CDockablePane中移除未使用的方法: SetCaptionStyle、 IsDrawCaption、 IsHideDisabledButtons、 GetRecentSiblingPaneInfo和 CanAdjustLayout。
移除 CDockablePane 的靜態成員變數 m_bCaptionText 和 m_bHideDisabledButtons。
將覆寫 DeleteString 方法加入至 CMFCFontComboBox。
從 CPane中移除未使用的方法: GetMinLength 和 IsLastPaneOnLastRow。
對 CPane::SetDockSiteRow的變更名稱的 CPane::GetDockSiteRow(CDockingPanesRow *) 。