共用方式為


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++ 程式庫

Bb531344.collapse_all(zh-tw,VS.110).gif平行模式程式庫和並行執行階段程式庫

UmsThreadDefaultSchedulerType 列舉型別已被取代。 UmsThreadDefault 的規格產生取代警告和內部對應至 ThreadScheduler

Bb531344.collapse_all(zh-tw,VS.110).gif標準樣板程式庫

  • 在 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()的人很重要的。

Bb531344.collapse_all(zh-tw,VS.110).gifCRT Library

  • C 執行階段 (CRT) 堆積,為 new 和 malloc()使用,不再是私用的。 CRT 現在使用管理堆積。 這表示不會終結堆積,當卸載 DLL 時,如此使用 CRT 連接必須以靜態方式確保 DLL、EXE 和 DLL 程式碼配置的記憶體清除,然後卸載之前。

  • 具有負值的 iscsymf() 函式判斷提示。

  • threadlocaleinfostruct 結構變更容納至地區設定函式的變更。

  • 有對應的性質 (如 memxxx()) 的 CRT 函式, strxxx() 從 intrin.h中移除。 如果您的只包含 intrin.h 這些函式的,現在必須包含對應的 CRT 標頭。

Bb531344.collapse_all(zh-tw,VS.110).gifMFC 和 ATL 程式庫。

被移除的融合支援 (afxcomctl32.h);因此,在 afxcomctl32.h 定義移除的所有方法。 標頭檔 afxcomctl32.h 和 afxcomctl32.inl 刪除。

變更 CDockablePane::RemoveFromDefaultPaneDividier 名稱為 CDockablePane::RemoveFromDefaultPaneDivider

變更 CFileDialog::SetDefExt 簽章使用 LPCTSTR;因此, Unicode 組建受影響。

追蹤分類的過時 ATL。

變更 CBasePane::MoveWindow 簽章接受常數 CRect

已變更之 CMFCEditBrowseCtrl::EnableBrowseButton簽章。

要移除的 m_fntTabsm_fntTabsBoldCMFCBaseTabCtrl

將參數傳遞給 CMFCRibbonStatusBarPane 建構函式。 (這是預設參數,和,因此無法來源中斷)。

將參數傳遞給 CMFCRibbonCommandsListBox 建構函式。 (這是預設參數,和,因此無法來源中斷)。

移除 AFXTrackMouse 應用程式開發介面 (和相關的計時器處理序)。 使用 Win32 TrackMouseEvent 應用程式開發介面。

將參數傳遞給 CFolderPickerDialog 建構函式。 (這是預設參數,和,因此無法來源中斷)。

CFileStatus 已變更的結構大小: m_attribute 成員位元組變更為 DWORD (與從 GetFileAttributes傳回的值)。

CRichEditCtrlCRichEditView 使用 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 類別。

IsFrequentlyUsedCmdCMFCCmdUsageCount::IsFreqeuntlyUsedCmd

更正數個 RestoreOriginalstate 執行個體至 RestoreOriginalState (CMFCToolBarCMFCMenuBarCMFCOutlookBarPane)。

CDockablePane中移除未使用的方法: SetCaptionStyleIsDrawCaptionIsHideDisabledButtonsGetRecentSiblingPaneInfoCanAdjustLayout

移除 CDockablePane 的靜態成員變數 m_bCaptionTextm_bHideDisabledButtons

將覆寫 DeleteString 方法加入至 CMFCFontComboBox

CPane中移除未使用的方法: GetMinLengthIsLastPaneOnLastRow

CPane::SetDockSiteRow的變更名稱的 CPane::GetDockSiteRow(CDockingPanesRow *)

請參閱

其他資源

Visual Studio 2012 中的 Visual C++ 使用者入門