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
Paralelní 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.
Standardní š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().
Knihovna 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.
Knihovna 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.