Freigeben über


Wichtige Änderungen in Visual C++

In diesem Dokument werden die wichtigen Änderungen in Visual C++ in Visual Studio 2012 aufgelistet.

Visual C++-Compiler

  • In Code, der kompiliert wird, indem /clr verwendet, das - Schlüsselwort definiert enum class-Enumeration eine ++11, keine Enumeration der CLR (Common Language Runtime).Um eine CLR-Enumeration zu definieren, müssen Sie über den Zugriff explizit sein.Das folgende Beispiel veranschaulicht dies.

    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()
            );
    } 
    
  • Verwenden Sie das - Schlüsselwort template, um einen abhängigen Namen (C++-Sprachenstandardkompatibilität) explizit zu herzustellen.Im folgenden Beispiel ist das hervorgehobene Vorlagenschlüsselwort erforderlich, die Mehrdeutigkeit aufzulösen.Weitere Informationen finden Sie unter Namensauflösung für abhängige Typen.

    template <typename X, typename AY> struct Container {
        typedef typename AY::template Rebind<X>::Other AX;
    };
    
  • Konstanter Ausdruck des Typs float wird nicht mehr als Vorlagenargument, wie im folgenden Beispiel gezeigt zulässig.

    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, die kompiliert wird, indem die /GS Befehlszeilenoption verwendet und die möglicherweise aus-durch-ein Sicherheitsrisiko hat, führt, zum Abbruch zur Laufzeit zu verarbeiten, wie im folgenden Pseudocode Beispiel gezeigt.

    char buf[MAX];
    int cch;
    ManipulateString(buf, &cch);
    // ...
    buf[cch] = '\0'; // if cch >= MAX, process will terminate
    
  • Die standardmäßige Architektur für x86-Builds wird zu SSE2-Anweisungen geändert; Daher kann der Compiler SSE-Anweisungen und wird die XMM-Register verwenden, um Gleitkommarechnungen auszuführen. Wenn Sie zum vorherigen Verhalten wiederherstellen möchten, verwenden Sie das /arch:IA32 Compilerflag, um die Architektur als IA32 anzugeben.

  • Der Compiler gibt möglicherweise Warnungen C4703 und C4701 aus, in denen er zuvor nicht geändert. Der Compiler beantragt dickere Überprüfungen Verwendung nicht initialisierten lokalen Variablen des Zeigertyps.

  • Wenn das neue Linkerflag /HIGHENTROPYVA angegeben wird, wird Windows 8 normalerweise Speicherbelegungen, eine 64-Bit-Adresse zurückzugeben.Vor ( Windows 8, solche zurückgegebenen Adressen der Zuordnungen häufig, die kleiner als 2 GB waren). Dies macht möglicherweise Zeigerabschneidenfehler im vorhandenen Code verfügbar. Standardmäßig ist dieser Schalter aktiviert. Um dieses Verhalten zu deaktivieren, geben Sie /HIGHENTROPYVA:NO an.

  • Der verwaltete Compiler (Visual Basic /C#) unterstützt auch /HIGHENTROPYVA für verwaltete Builds.In diesem Fall ist der /HIGHENTROPYVA Schalter standardmäßig deaktiviert.

Integrierte Entwicklungsumgebung

  • Die folgenden Projektvorlagen sind nicht mehr:

    • Windows Forms-Anwendung

    • Windows Forms-Steuerelementbibliothek

  • Obwohl empfohlen, dass Sie keine Windows Forms-Anwendungen in C++/CLI erstellen, wird die Wartung der vorhandenen Anwendungen C++/CLIs Benutzeroberfläche unterstützt.Wenn Sie eine Windows Forms-Anwendung oder eine andere Anwendung .NET Benutzeroberfläche, mit C# oder Visual Basic erstellen müssen.Verwendung C++/CLI für Interoperabilität nur vorgesehen.

Visual C++-Bibliotheken

Bb531344.collapse_all(de-de,VS.110).gifParallel Patterns Library und Concurrency Runtime-Bibliothek

Die SchedulerType-Enumeration von UmsThreadDefault ist veraltet.Angabe von UmsThreadDefault erzeugt eine veraltete Warnung und intern Zuordnungen zurück zu ThreadScheduler.

Bb531344.collapse_all(de-de,VS.110).gifStandard Template Library

  • Nach einer Änderung zwischen Standards C++98/03 und C++11, unter Verwendung expliziter Vorlagenargumente, von make_pair() aufzurufen - wie in make_pair<int, int>(x, y)- in der Regel nicht in Visual C++ in Visual Studio 2012 kompiliert.Die Lösung besteht darin, make_pair() ohne explizite Vorlage Argument-wie in make_pair(x, y) immer aufzurufen.Die Bereitstellung von expliziten Vorlagenargumenten fehlt den Zweck der Funktion.Wenn Sie präzise Kontrolle über dem resultierenden Typ benötigen, verwenden Sie pair anstelle make_pair- wie in pair<short, short>(int1, int2).

  • Eine weitere Änderung zwischen Standards C++98/03 und C++11: Wenn A mit B und zu B implizit in ist, ist zu C implizit in, jedoch ist nicht implizit in diesen (implizit oder explizit) zu pair<C, X> konvertiert werden, C++98/03 C und zu Visual C++ 2010 sind gehabtem pair<A, X>.(Der andere Typ, X, ist nicht relevant hier, und dieser ist nicht zum ersten in die Paare festgelegt). Da C++11 und Visual C++ in Visual Studio 2012 erkennen, dass A nicht implizit in diesen zu C ist, entfernen sie die Paarkonvertierung aus der Überladungsauflösung.Dies ist eine positive Änderung für viele Szenarios.Beispielsweise func(const pair<int, int>&) und func(const pair<string, string>&) überladend und func() mit pair<const char *, const char *> Aufrufen kompiliert mit dieser Änderung.Allerdings wird diese Änderung Code, der auf aggressiven Paarkonvertierungen beruhte.Solcher Code kann in der Regel behoben werden, indem ein Teil der Konvertierung explizit-für Beispiel ausführt, indem make_pair(static_cast<B>(a), x) an eine Funktion übergeben wird, die pair<C, X> erwartet.

  • Visual C++ 2010 simulierte variadic Vorlage – z. B. make_shared<T>(arg1, arg2, argN)- oben zu einer Tiefe von 10 Argumenten, indem Überladungen und Spezialisierungen mit Präprozessormaschinerie ausrottete.In Visual C++ in Visual Studio 2012 wird diese Beschränkung auf 5 Argumenten reduziert, um Kompilierzeiten und Compilerspeicherverbrauch für die Mehrzahl der Benutzer zu verbessern.Sie können jedoch die vorherige Begrenzung bewerten, indem Sie explizit _VARIADIC_MAX als 10 definieren, Projekt-weit.

  • C++11 17.6.4.3 .1 [Makro.Name]/2 aufzubewahren Makro-izingschlüsselworte, wenn C++-Standardbibliotheksheader enthalten sind.Die Header geben jetzt Compilerfehler aus, wenn sie Makro-izedschlüsselworte erkennen.(Das Definieren von _ALLOW_KEYWORD_MACROS ermöglicht solchem Code, um zu kompilieren, doch es stark es diese Verwendung.) Als Ausnahme wird Makro-ized new standardmäßig zulässig, da die Header sich umfassend absichern, indem sie #pragma push_macro("new")/#undef new/#pragma pop_macro("new") verwenden.Das Definieren von _ENFORCE_BAN_OF_MACRO_NEW wird genau, wodurch der Name vermuten.

  • Um verschiedene Optimierungen und Debuggingsüberprüfungen zu implementieren, unterbricht die C++-Standardbibliotheksimplementierung absichtlich binäre Kompatibilität mit Versionen von Visual Studio (2005, 2008, 2010, 2012).Wenn die C++-Standardbibliothek verwendet wird, verbietet diese die gemeinsame Ausführung von Objektdateien und von statischen Bibliotheken, die kompiliert werden, indem verschiedene Versionen in eine Binärdatei (EXE oder DLL) verwendet, und verbietet die Übergabe von C++-Standardbibliotheksobjekten zwischen Binärdateien, die kompiliert werden, indem verschiedene Versionen verwendet.Das gemeinsame Ausführung von Objektdateien und von statischen Bibliotheken (mithilfe der C++-Standardbibliothek) das kompiliert wurden, indem Visual C++ 2010 mit denen verwendete, die kompiliert wurden, indem Visual C++ in Visual Studio 2012 verwendete, gibt Linkerfehler über _MSC_VER Konflikt aus, in dem _MSC_VER das Makro handelt, das die Hauptversion des Compilers (1700 für Visual C++ in Visual Studio 2012) enthält.Diese Überprüfung kann DLL-Mixing nicht erkennen und kann gemeinsame Ausführung nicht erkennen, das Visual C++ 2008 oder früher einschließt.

  • Zusätzlich zum Erkennen von Konflikten _ITERATOR_DEBUG_LEVEL, das in Visual C++ 2010 implementiert wurde, erkennt Visual C++ in Visual Studio 2012 RuntimeLibrary-Konflikte.Diese treten auf, wenn die Compileroptionen /MT statische (Version), /MTd (statisch Debug), /MD (dynamische Version) und /MDd (dynamisches Debug) kombiniert werden.

  • operator<(), operator>(), operator<=() und operator>=() waren für die std::unordered_map und stdext::hash_map Familien von Containern zuvor verfügbar, obwohl ihre Implementierungen nicht tatsächlich nützlich waren.Diese nicht standardmäßigen Operatoren sind in Visual C++ in Visual Studio 2012 entfernt.Außerdem ist die Implementierung von operator==() und operator!=() für die std::unordered_map Familie erweitert, um die stdext::hash_map Familie abzudecken.(Es wird empfohlen, die Verwendung der stdext::hash_map Familie im neuen Code vermeiden.)

  • C++11 22.4.1.4 [locale.codecvt] gibt, dass codecvt::length() und codecvt::do_length() änderbare stateT&-Parameter verwenden möchten, das Visual C++ 2010 dauerte const stateT& an.Visual C++ in Visual Studio 2012 akzeptiert stateT&, wie vom standardmäßigen beauftragt.Dieser Unterschied ist für jeden signifikant, die versucht, die virtuelle Funktion do_length() zu überschreiben.

Bb531344.collapse_all(de-de,VS.110).gifCRT Library

  • Der C-Ablauf (CRT) Heap, der für new und malloc() verwendet wird, ist nicht mehr privat.Die CRT- verwendet jetzt den Prozessheap.Dies bedeutet, dass der Heap nicht, wenn eine DLL entladen wird, so DLL zerstört wird, statisch mit CRT verknüpfen muss sicherstellen, dass der Arbeitsspeicher, der von den DLL-Code zugeordnet ist, wird bereinigt, bevor sie entladen hat.

  • Die iscsymf()-Funktionsassertionen mit negativen Werten.

  • Die threadlocaleinfostruct-Struktur wurde geändert, um die Änderungen an den Gebietsschemafunktionen angepasst.

  • CRT-Funktionen, die entsprechende systeminternen Funktionen wie memxxx() haben, strxxx() werden von intrin.h entfernt.Wenn Sie nach intrin.h nur für diese Funktionen, Sie die entsprechenden CRT-Header jetzt benötigen.

Bb531344.collapse_all(de-de,VS.110).gifMFC- und ATL-Bibliotheken

Die Fusions-Unterstützung (afxcomctl32.h); Daher sind alle Methoden, die in afxcomctl32.h definiert werden, entfernt.Headerdateien afxcomctl32.h und afxcomctl32.inl sind gelöscht.

Änderung in Namen von CDockablePane::RemoveFromDefaultPaneDividier zu CDockablePane::RemoveFromDefaultPaneDivider.

Die - Signatur von CFileDialog::SetDefExt, um LPCTSTR zu verwenden; Daher werden Unicode-Builds beeinflusst.

Veraltete ATL-Ablaufverfolgungskategorien.

Die - Signatur von CBasePane::MoveWindow, um ein const CRect zu akzeptieren.

Die - Signatur von CMFCEditBrowseCtrl::EnableBrowseButton.

Entferntes m_fntTabs und m_fntTabsBold von CMFCBaseTabCtrl.

Es wurde ein Parameter an CMFCRibbonStatusBarPane-Konstruktoren hinzu.(Es ist ein Standardparameter und daher Quelle-unterbricht es nicht.)

Es wurde ein Parameter an den CMFCRibbonCommandsListBox-Konstruktor hinzu.(Es ist ein Standardparameter und daher Quelle-unterbricht es nicht.)

entfernt das AFXTrackMouse API (und verknüpfte Zeitgeber proc).Verwenden Sie stattdessen TrackMouseEvent Win32 API.

Es wurde ein Parameter an den CFolderPickerDialog-Konstruktor hinzu.(Es ist ein Standardparameter und daher Quelle-unterbricht es nicht.)

CFileStatus-Strukturgröße geändert: Der m_attribute-Member kann von BYTE zu DWORD (Wert entsprechen, der von GetFileAttributes zurückgegeben wird).

CRichEditCtrl und CRichEditView Verwendung MSFTEDIT_CLASS (Steuerelement RichEdit 4,1) statt RICHEDIT_CLASS (Steuerelement RichEdit 3.0) in den Unicode-Builds.

Entferntes AFX_GLOBAL_DATA::IsWindowsThemingDrawParentBackground, da es immer unter Windows Vista, Windows 7 und Windows 8. den Wert TRUE ist.

Entferntes AFX_GLOBAL_DATA::IsWindowsLayerSupportAvailable, da es immer unter Windows Vista, Windows 7 und Windows 8. den Wert TRUE ist.

Entferntes AFX_GLOBAL_DATA::DwmExtendFrameIntoClientArea.Rufen Sie Windows-API direkt unter Windows Vista, Windows 7 und Windows 8. auf.

Entferntes AFX_GLOBAL_DATA::DwmDefWindowProc.Rufen Sie Windows-API direkt unter Windows Vista, Windows 7 und Windows 8. auf.

Umbenanntes AFX_GLOBAL_DATA::DwmIsCompositionEnabled zu IsDwmCompositionEnabled, um den Namenskonflikts zu vermeiden.

Geänderte Bezeichner für einige interne Zeitgeber MFC und den Definitionen auf afxres.h (AFX_TIMER_ID_*) verschoben.

Die - Signatur von OnExitSizeMove-Methode, um mit dem ON_WM_EXITSIZEMOVE-Makro ausgerichtet:

  • CFrameWndEx

  • CMDIFrameWndEx

  • CPaneFrameWnd

Die den Namen und die Signatur von OnDWMCompositionChanged, um mit dem ON_WM_DWMCOMPOSITIONCHANGED-Makro ausgerichtet:

  • CFrameWndEx

  • CMDIFrameWndEx

  • CPaneFrameWnd

Die - Signatur von OnMouseLeave-Methode, um mit dem ON_WM_MOUSELEAVE-Makro ausgerichtet:

  • CMFCCaptionBar

  • CMFCColorBar

  • CMFCHeaderCtrl

  • CMFCProperySheetListBox

  • CMFCRibbonBar

  • CMFCRibbonPanelMenuBar

  • CMFCRibbonRichEditCtrl

  • CMFCSpinButtonCtrl

  • CMFCToolBar ReplaceThisText

  • CMFCToolBarComboBoxEdit

  • CMFCToolBarEditCtrl

  • CMFCAutoHideBar

Die - Signatur von OnPowerBroadcast, um mit dem ON_WM_POWERBROADCAST-Makro ausgerichtet:

  • CFrameWndEx

  • CMDIFrameWndEx

Die - Signatur von OnStyleChanged, um mit dem ON_WM_STYLECHANGED-Makro ausgerichtet:

  • CMFCListCtrl

  • CMFCStatusBar

Umbenannte die interne Methode FontFamalyProcFonts zu FontFamilyProcFonts.

Entferntes zahlreiche globales statisches CString-Objekte, um Speicherverluste (ersetzt durch #defines) und die folgenden Klassenmembervariablen in einigen Situationen zu vermeiden:

  • 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

Die - Signatur von CKeyboardManager::ShowAllAccelerators und hat den Zugriffstastentrennzeichenparameter.

Ein CPropertyPage::GetParentSheet und in der CPropertyPage-Klasse, rufen sie anstelle GetParent auf, um das richtige Elemente Blattfenster abzurufen, das möglicherweise das übergeordnete Element oder Fenster der zweiten übergeordneten Ebene zu CPropertyPage ist.Möglicherweise müssen Sie den Code ändern, um GetParentSheet anstelle GetParent aufzurufen.

Feste unausgeglichene #Pragmawarnung (Push) in ATLBASE.H, das Warnungen verursacht hat, falsch deaktiviert werden.Diese Warnungen werden jetzt ordnungsgemäß aktiviert, nachdem ATLBASE.H analysiert wurde.

Verschobene D2D-related Methoden von AFX_GLOBAL_DATA zu _AFX_D2D_STATE:

  • GetDirectD2dFactory

  • GetWriteFactory

  • GetWICFactory

  • InitD2D

  • ReleaseD2DRefs

  • IsD2DInitialized

  • D2D1MakeRotateMatrix

  • Anstatt, beispielsweise afxGlobalData.IsD2DInitialized, Aufruf AfxGetD2DState->IsD2DInitialized aufzurufen.

Veraltete ATL*.CPP-Dateien wurden aus dem Ordner \atlmfc\include\ entfernt.

Verschobene afxGlobalData Initialisierung zu bedarfsabhängigem statt an der CRT-Initialisierungszeit, DLLMain-Anforderungen erfüllen.

Es wurde die RemoveButtonByIndex-Methode zur CMFCOutlookBarPane-Klasse hinzu.

Korrigiertes CMFCCmdUsageCount::IsFreqeuntlyUsedCmd zu IsFrequentlyUsedCmd.

korrigiert mehrere Instanzen von RestoreOriginalstate zu RestoreOriginalState (CMFCToolBar, CMFCMenuBar, CMFCOutlookBarPane).

Die nicht verwendete Methoden von CDockablePane: SetCaptionStyle, IsDrawCaption, IsHideDisabledButtons, GetRecentSiblingPaneInfo und CanAdjustLayout.

Die statische Membervariablen m_bCaptionText und m_bHideDisabledButtonsCDockablePane.

Es wurde eine DeleteString-Überschreibungsmethode zu CMFCFontComboBox hinzugefügt.

Die nicht verwendete Methoden von CPane: GetMinLength und IsLastPaneOnLastRow.

Umbenanntes CPane::GetDockSiteRow(CDockingPanesRow *) zu CPane::SetDockSiteRow.

Siehe auch

Weitere Ressourcen

Erste Schritte mit Visual C++ in Visual Studio 2012