Sdílet prostřednictvím


Zrušení změn v jazyce C++

Tento dokument obsahuje seznam nejnovějších změn v Visual C++ v sadě Visual Studio 2012.

Kompilátor Visual C++

  • V kódu, který je zkompilován s použitím /clr, enum class klíčové slovo definuje C ++ 11 enum, není společný jazyk runtime (CLR) výčet.Chcete-li definovat CLR výčtového typu musí být explicitní o jeho dostupnosti.Následující příklad ukazuje to.

    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()
            );
    } 
    
  • Použití template klíčové slovo explicitně rozlišit závislý název (standardní jazyk C++ shodu).V následujícím příkladu je povinné vyřešení nejednoznačnosti klíčového slova zvýrazněná šablony.Další informace naleznete v tématu Překlad závislých typů.

    template <typename X, typename AY> struct Container {
        typedef typename AY::template Rebind<X>::Other AX;
    };
    
  • Konstantní výraz typu float již není povoleno jako šablonu argumentu, jak je znázorněno v následujícím příkladu.

    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
    
  • Kód, který je zkompilován s použitím /GS parametr příkazového řádku a která má vypnutí po druhém chyba zabezpečení může vést ke zpracování ukončení běhu, jak ukazuje následující příklad pseudokódu.

    char buf[MAX];
    int cch;
    ManipulateString(buf, &cch);
    // ...
    buf[cch] = '\0'; // if cch >= MAX, process will terminate
    
  • Výchozí pro architekturu x 86, sestavení je změněn na SSE2; Proto kompilátor vyzařovat instrukce SSE a použije XMM registrů, k provádění výpočtů s plovoucí desetinnou čárkou. Pokud se chcete vrátit k předchozí chování, použijte /arch:IA32 zadat architektury IA32 příznak kompilátoru.

  • Kompilátor může vydat varování C4703 a C4701, kde dříve stejně není. Kompilátor použije silnější kontroly pro použití neinicializované lokální proměnné typu ukazatel.

  • Při označení nového propojovacího programu /HIGHENTROPYVA není zadán, Windows 8 obvykle způsobí přidělení paměti pro zpáteční adresu 64-bit.(Před Windows 8, tyto příděly častěji vrátil adresy, které byly menší než 2 GB.) To může vystavit ukazatel zkrácení chyby v existujícím kódu. Tento přepínač je ve výchozím na. Chcete-li toto chování zakázat, zadejte /HIGHENTROPYVA:NO.

  • Spravované kompilátoru (Visual Basic nebo C#) podporuje také /HIGHENTROPYVA pro spravované sestavení.V tomto případě však /HIGHENTROPYVA přepínač je vypnuto ve výchozím nastavení.

Integrované vývojové prostředí (IDE)

  • Následující šablony projektu již neexistuje:

    • Formulářová aplikace Windows

    • Knihovna ovládacích prvků formulářů Windows

  • Přestože doporučujeme nevytvářejte model Windows Forms aplikace v C + +/ CLI, údržba stávajících C + +/ CLI uživatelského rozhraní aplikace je podporována.Máte-li k vytvoření aplikace model Windows Forms nebo jiné uživatelské rozhraní .NET aplikace, pomocí jazyka C# nebo Visual Basic.Použijete-li C + +/ CLI pro interoperabilitu pouze účely.

Visual C++ - knihovny

Bb531344.collapse_all(cs-cz,VS.110).gifParalelní vzory knihovny a knihovny Runtime souběžnosti

SchedulerType Výčet UmsThreadDefault je zastaralý.Specifikace UmsThreadDefault vytváří zastaralé upozornění a vnitřně mapuje zpět ThreadScheduler.

Bb531344.collapse_all(cs-cz,VS.110).gifStandardní šablona knihovny

  • Po změně rozdělení mezi C ++ 98/03 a C ++ 11 normy pomocí argumentů šablony explicitní volání make_pair(), jako v make_pair<int, int>(x, y)– obvykle není slučitelný s Visual C++ v sadě Visual Studio 2012.Řešením je vždy volání make_pair() bez argumentů explicitní šablony – jako v make_pair(x, y).Poskytnutím explicitní šablony argumentů defeats účel funkce.Chcete-li mít přesnou kontrolu nad výsledný typ, použijte pair namísto make_pair, jako v pair<short, short>(int1, int2).

  • Změně jiné rozdělení mezi C ++ 98/03 a C ++ 11 normy: Pokud je implicitně převést na je implicitně převést na C, B a B, ale není implicitně převést na C, C A ++ 98/03 a Visual C++ 2010 povoleno pair<A, X> převést (implicitně nebo explicitně) do pair<C, X>.(Typ, X, není zde na úroky a není specifické pro první typ dvojice.) Protože C ++ 11 a Visual C++ v sadě Visual Studio 2012 zjistit, že nelze implicitně převést na C, odstraňují pár převod z procedury s pozdní vazbou.To je pozitivní změna v mnoha scénářích.Například přetížení func(const pair<int, int>&) a func(const pair<string, string>&)a volání func() s pair<const char *, const char *> zkompiluje této změny.Tato změna však přeruší kód, který dovolávat převody agresivní pár.Takový kód lze obvykle vyřešit provedením jedné části převodu explicitně – například předáním make_pair(static_cast<B>(a), x) funkci, která očekává, že pair<C, X>.

  • Visual C++ 2010Simulované variadic šablony, například make_shared<T>(arg1, arg2, argN)– až do výše 10 argumenty pomocí razítkování přetížení a odborností s preprocesoru strojního zařízení.V Visual C++ v sadě Visual Studio 2012, tento limit je zmenšen na 5 argumenty ke zlepšení doby kompilace a spotřeba paměti kompilátor pro většinu uživatelů.Předchozí omezení však může nastavit explicitně definováním _VARIADIC_MAX jako 10, projekt celé.

  • C ++ 11 17.6.4.3.1 [makro.názvy] / 2 zakazuje makro izing klíčová slova, když záhlaví standardní knihovna C++ jsou zahrnuty.Záhlaví nyní generuje chyby kompilátoru při detekci makro ized klíčová slova.(Definování _ALLOW_KEYWORD_MACROS umožňuje takový kód zkompilovat, ale jsme silně odrazovat od tohoto použití.) Výjimečně se makro ized new je povolena ve výchozím nastavení, protože záhlaví komplexně hájit pomocí #pragma push_macro("new")/#undef new/#pragma pop_macro("new").Definování _ENFORCE_BAN_OF_MACRO_NEW nemá, přesně jak naznačuje její název.

  • Provádět různé optimalizace a ladění kontroly provádění standardní knihovna C++ záměrně konce binární kompatibilita mezi jednotlivými verzemi sady Visual Studio (2005, 2008, 2010, 2012).Při použití standardní knihovny C++ to zakazuje míchání objektové soubory a statické knihovny, které jsou kompilovány pomocí různých verzí do jednoho binární soubor (EXE nebo DLL) a zakazuje předávání objekty standartní knihovny jazyka C++ mezi binární soubory, které jsou kompilovány pomocí různých verzí.Míchání objektové soubory a statických knihoven (použití standardní knihovny C++), které byly zkompilovány pomocí Visual C++ 2010 s těmi, které byly zkompilovány pomocí Visual C++ v sadě Visual Studio 2012 vysílá chyby propojovacího programu o _MSC_VER neshody, kde _MSC_VER je makro, které obsahuje hlavní verze kompilátoru (1700 pro Visual C++ v sadě Visual Studio 2012).Tato kontrola nemůže rozpoznat DLL míchání a nemůže rozpoznat, míchání, který zahrnuje Visual C++ 2008 nebo starší.

  • Kromě zjištění _ITERATOR_DEBUG_LEVEL problémy, které bylo implementováno v Visual C++ 2010, Visual C++ v sadě Visual Studio 2012 zjistí RuntimeLibrary neshody.K těm dochází při možnosti kompilátoru /MT (statické vydání), /MTd (statické ladění), /MD (dynamické vydání) a /MDd (dynamické ladění) se míchají.

  • operator<(), operator>(), operator<=(), a operator>=() byly dříve k dispozici pro std::unordered_map a stdext::hash_map rodin kontejnerů, přestože jejich implementace nebyly skutečně užitečné.Tyto nestandardní operátory byly odebrány v Visual C++ v sadě Visual Studio 2012.Navíc provádění operator==() a operator!=() pro std::unordered_map řady byla rozšířena na pokrytí stdext::hash_map rodiny.(Doporučujeme se vyvarovat použití stdext::hash_map řady nový kód.)

  • C ++ 11 22.4.1.4 [locale.codecvt] Určuje, že codecvt::length() a codecvt::do_length() by měla trvat měnit stateT& parametry, ale Visual C++ 2010 trvalo const stateT&.Visual C++ v sadě Visual Studio 2012má stateT& jako schváleny standardem.Tento rozdíl je významné pro kohokoli, kdo se pokouší o přepsání virtuální funkce do_length().

Bb531344.collapse_all(cs-cz,VS.110).gifKnihovna CRT

  • Halda C Runtime (CRT), který se používá pro new a malloc(), již není privátní.CRT nyní používá haldu procesu.To znamená, že haldy není zničeno, když je knihovna DLL uvolněna, takže knihovny DLL, které jsou staticky propojeny s CRT musí zajistit paměť přidělená kód knihovny DLL se bude čistit dříve, než byl uvolněn z paměti.

  • iscsymf() Funkce uplatňuje se zápornou hodnotou.

  • threadlocaleinfostruct Došlo ke změně struktury a přizpůsobuje změny funkce národního prostředí.

  • Funkce CRT, které mají odpovídající vnitřní, jako memxxx(), strxxx() jsou odebrány z intrin.h.Pokud jste zahrnuli intrin.h pouze pro tyto funkce musí nyní obsahují odpovídající záhlaví CRT.

Bb531344.collapse_all(cs-cz,VS.110).gifKnihovna MFC a knihovny ATL

Odebrat podporu jaderné syntézy (afxcomctl32.h); Proto byly odebrány všechny metody, které jsou definovány v afxcomctl32.h.Záhlaví soubory afxcomctl32.h a afxcomctl32.inl byly odstraněny.

Změnit název CDockablePane::RemoveFromDefaultPaneDividier na CDockablePane::RemoveFromDefaultPaneDivider.

Změnit podpis CFileDialog::SetDefExt použití LPCTSTR; sestavení Unicode jsou ohroženy.

Odebrány zastaralé kategorie trasování ATL.

Změnit podpis CBasePane::MoveWindow vzít const CRect.

Změnit podpis CMFCEditBrowseCtrl::EnableBrowseButton.

Removed m_fntTabs and m_fntTabsBold from CMFCBaseTabCtrl.

Přidán parametr CMFCRibbonStatusBarPane konstruktory.(Je výchozí parametr, a je tedy není zdroj rozdělení.)

Přidán parametr CMFCRibbonCommandsListBox konstruktor.(Je výchozí parametr, a je tedy není zdroj rozdělení.)

Odebrat AFXTrackMouse rozhraní API (a související časovače proc).Použití Win32 TrackMouseEvent rozhraní API místo.

Přidán parametr CFolderPickerDialog konstruktor.(Je výchozí parametr, a je tedy není zdroj rozdělení.)

CFileStatuskonstrukce Změna velikosti: m_attribute člen změněna z BAJTU DWORD (hodnota vrácená z GetFileAttributes).

CRichEditCtrla CRichEditView MSFTEDIT_CLASS (ovládací prvek RichEdit 4.1) namísto RICHEDIT_CLASS (ovládací prvek RichEdit 3.0) v sestavení Unicode použít.

Odebrat AFX_GLOBAL_DATA::IsWindowsThemingDrawParentBackground je vždy na systém Windows Vista, Windows 7 a 8 v systému Windows.

Odebrat AFX_GLOBAL_DATA::IsWindowsLayerSupportAvailable je vždy na systém Windows Vista, Windows 7 a 8 v systému Windows.

Removed AFX_GLOBAL_DATA::DwmExtendFrameIntoClientArea.Volání Windows API přímo v systému Windows Vista, Windows 7 a Windows 8.

Removed AFX_GLOBAL_DATA::DwmDefWindowProc.Volání Windows API přímo v systému Windows Vista, Windows 7 a Windows 8.

Přejmenování AFX_GLOBAL_DATA::DwmIsCompositionEnabled na IsDwmCompositionEnabled k odstranění kolize názvů.

Změnit identifikátory pro počet vnitřního časovače knihovny MFC a definice přesunut do afxres.h (AFX_TIMER_ID_*).

Změnit podpis OnExitSizeMove metoda tak, aby souhlasilo s makro ON_WM_EXITSIZEMOVE:

  • CFrameWndEx

  • CMDIFrameWndEx

  • CPaneFrameWnd

Změnit jméno a podpis OnDWMCompositionChanged tak, aby souhlasilo s makro ON_WM_DWMCOMPOSITIONCHANGED:

  • CFrameWndEx

  • CMDIFrameWndEx

  • CPaneFrameWnd

Změnit podpis OnMouseLeave metoda tak, aby souhlasilo s makro ON_WM_MOUSELEAVE:

  • CMFCCaptionBar

  • CMFCColorBar

  • CMFCHeaderCtrl

  • CMFCProperySheetListBox

  • CMFCRibbonBar

  • CMFCRibbonPanelMenuBar

  • CMFCRibbonRichEditCtrl

  • CMFCSpinButtonCtrl

  • CMFCToolBar ReplaceThisText

  • CMFCToolBarComboBoxEdit

  • CMFCToolBarEditCtrl

  • CMFCAutoHideBar

Změnit podpis OnPowerBroadcast tak, aby souhlasilo s makro ON_WM_POWERBROADCAST:

  • CFrameWndEx

  • CMDIFrameWndEx

Změnit podpis OnStyleChanged tak, aby souhlasilo s makro ON_WM_STYLECHANGED:

  • CMFCListCtrl

  • CMFCStatusBar

Přejmenovat interní metoda FontFamalyProcFonts na FontFamilyProcFonts.

Odebráno mnoho globální statické CString objekty, chcete-li vyloučit paměť nevrací v některých situacích (nahrazen # definuje), a následující třídy, proměnné členů:

  • 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

Změnit podpis CKeyboardManager::ShowAllAccelerators a odebrat akcelerátor oddělovač parametr.

Přidáno CPropertyPage::GetParentSheeta CPropertyPage třídy, zavolejte ji namísto GetParent správné nadřazené okno listu, které mohou být nadřazené nebo nadřazený okna tak, aby CPropertyPage.Pravděpodobně budete muset změnit váš kód k volání GetParentSheet namísto GetParent.

Pevné nevyrovnané #pragma warning(push) v ATLBASE.H, která způsobila upozornění nesprávně zakázán.Tato upozornění jsou nyní k dispozici správně po ATLBASE.H nebyl analyzován.

Přesunutí D2D související metody z AFX_GLOBAL_DATA na _AFX_D2D_STATE:

  • GetDirectD2dFactory

  • GetWriteFactory

  • GetWICFactory

  • InitD2D

  • ReleaseD2DRefs

  • IsD2DInitialized

  • D2D1MakeRotateMatrix

  • Místo volání, například afxGlobalData.IsD2DInitialized, volejte AfxGetD2DState->IsD2DInitialized.

Odebrány zastaralé ATL *.CPP soubory ze složky \atlmfc\include\.

Přesunout afxGlobalData inicializace na vyžádání namísto v době inicializace CRT, splňovat požadavky stanovené v DLLMain.

Přidáno RemoveButtonByIndex metoda CMFCOutlookBarPane třídy.

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.

Odebrat CDockablePane proměnné statický člen m_bCaptionText a m_bHideDisabledButtons.

Přidáno přepsání DeleteString metody CMFCFontComboBox.

Odebrání nepoužívaných metod z CPane: GetMinLength a IsLastPaneOnLastRow.

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

Viz také

Další zdroje

Začínáme s jazykem Visual C++ v sadě Visual Studio 2012