Condividi tramite


Ultime modifiche in Visual C++

In questo documento sono elencate le ultime modifiche in Visual C++ in Visual Studio 2012.

Compilatore Visual C++

  • Nel codice compilato utilizzando /clr, la parola chiave di enum class definisce enum c ++11, non un enum di (CLR) di Common Language Runtime.Per definire un enum clr, è necessario essere esplicito sulla sua accessibilità.Nell'esempio che segue viene illustrato quanto descritto.

    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()
            );
    } 
    
  • Utilizzare la parola chiave di template in modo esplicito per rendere chiaro un nome dipendente (conformità standard C++).Nell'esempio seguente, la parola chiave evidenziata del modello è obbligatoria per risolvere l'ambiguità.Per ulteriori informazioni, vedere Risoluzione dei nomi dei tipi dipendenti.

    template <typename X, typename AY> struct Container {
        typedef typename AY::template Rebind<X>::Other AX;
    };
    
  • L'espressione costante di tipo float non è più consentito come argomento di modello, come illustrato nell'esempio seguente.

    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
    
  • Il codice compilato utilizzando l'opzione della riga di comando di /GS con fuori da una vulnerabilità può comportare per elaborare la chiusura di runtime, come illustrato nell'esempio di pseudo-codice.

    char buf[MAX];
    int cch;
    ManipulateString(buf, &cch);
    // ...
    buf[cch] = '\0'; // if cch >= MAX, process will terminate
    
  • L'architettura predefinita per le compilazioni x86 viene impostata su; SSE2 pertanto, il compilatore può generare istruzioni di SSE e utilizzerà i registri XMM per eseguire i calcoli a virgola mobile. Se si desidera ripristinare il comportamento precedente, quindi utilizzare il flag del compilatore di /arch:IA32 per specificare l'architettura come IA32.

  • Il compilatore può inviare avvisi C4703 e C4701 in precedenza non ha completato. Il compilatore consente di applicare più complesse controlli per utilizzare le variabili locali non inizializzata di tipo puntatore.

  • Quando il nuovo contrassegno /HIGHENTROPYVA del linker viene specificato, Windows 8 in genere determina le allocazioni di memoria a restituire un indirizzo a 64 bit.(Prima di Windows 8, tali indirizzi più spesso restituiti di allocazioni in corso minore di 2 GB.) Ciò può esporre i bug di troncamento puntatore nel codice esistente. Per impostazione predefinita, questa opzione è attivata. Per disabilitare questo comportamento, specificare /HIGHENTROPYVA:NO.

  • Il compilatore gestito (Visual Basic /C#) supporta inoltre /HIGHENTROPYVA per le compilazioni gestiti.Tuttavia, in questo caso, l'opzione di /HIGHENTROPYVA sono disattivati per impostazione predefinita.

Ambiente di sviluppo integrato

  • I modelli di progetto non più esistenti:

    • Applicazione Windows Form

    • Libreria di controllo Windows Form

  • Sebbene sia consigliabile non si creano applicazioni Windows Form in C++/CLI, la manutenzione di applicazioni esistenti di interfaccia utente C++/CLI è supportato.Se è necessario creare un'applicazione Windows Form, o qualsiasi altra applicazione dell'interfaccia utente di .NET, c di utilizzo o Visual Basic.Utilizzo RISPETTO a scopo di interoperabilità solo.

Librerie di Visual C++

Bb531344.collapse_all(it-it,VS.110).gifPPL (parallel patterns library) e la libreria di runtime di concorrenza

L'enumerazione di SchedulerType di UmsThreadDefault è deprecata.La specifica di UmsThreadDefault genera un avviso deprecato e internamente i mapping a ThreadScheduler.

Bb531344.collapse_all(it-it,VS.110).gifLibreria di modelli standard

  • A seguito di una modifica sostanziale tra gli standard C++98/03 e C++11, utilizzando gli argomenti di template espliciti per chiamare make_pair()ad esempio in make_pair<int, int>(x, y)(in genere non viene compilato in Visual C++ in Visual Studio 2012.La soluzione consiste nel chiamare sempre make_pair() senza modello esplicito argomento- come in make_pair(x, y).Fornendo argomenti di template espliciti multithreading risulta vanificato lo scopo della funzione.Se si richiede un controllo preciso sul tipo risultante, utilizzare pair anziché make_pairad esempio in pair<short, short>(int1, int2).

  • Un altro modifiche sostanziali tra gli standard C++98/03 e C++11: Quando viene implicitamente convertibile in B e a B è convertibile in modo implicito in C, ma A non è convertibile in modo implicito in C, a C++98/03 e a pair<A, X> consentito Visual C++ 2010 da convertire in modo implicito o esplicito) a pair<C, X>.(Altro tipo, X, non è interessato qui e non si tratta del primo tipi della coppia.) Poiché C++11 e Visual C++ in Visual Studio 2012 rilevano che non è convertibile in modo implicito in C, rimuovere la conversione di una coppia di risoluzione dell'.Si tratta di una modifica positiva per molti scenari.Ad esempio, esegue l'overload di func(const pair<int, int>&) e func(const pair<string, string>&)e chiamando func() con pair<const char *, const char *> *, compilerà a questa modifica.Tuttavia, questa modifica interrompe il codice che ha basato sulle conversioni aggressive di coppie.Tale codice può in genere essere risolto eseguendo una parte della conversione in modo esplicito, ad esempio passando make_pair(static_cast<B>(a), x) a una funzione che prevede pair<C, X>.

  • Visual C++ 2010 ha simulato variadic controllo, ad esempio make_shared<T>(arg1, arg2, argN)— fino al limite di 10 argomenti, timbrando a overload e le specializzazioni al macchinario del preprocessore.In Visual C++ in Visual Studio 2012, questo limite viene ridotto a 5 argomenti per migliorare le fasi di compilazione e il consumo di memoria del compilatore per la maggior parte degli utenti.Tuttavia, è possibile impostare il limite precedente definendo esplicitamente _VARIADIC_MAX come 10, non valido.

  • C++11 17.6.4.3 .1 [macro.]/2 di nomi vieta le parole chiave di macro - izing quando le intestazioni standard di C++ sono incluse.Le intestazioni ora generano errori del compilatore se rilevano le parole chiave di macro - ized.(Definire _ALLOW_KEYWORD_MACROS modo che tale codice compilare, ma scoraggiamo sicuro che utilizzano.) Come eccezione, la macro - ized new è consentita per impostazione predefinita, le intestazioni si difendono completamente utilizzando #pragma push_macro("new")/#undef new/#pragma pop_macro("new").La definizione di _ENFORCE_BAN_OF_MACRO_NEW fare esattamente quali il nome implica.

  • Per implementare le varie ottimizzazioni e controlli di debug, l'implementazione standard di C++ viene intenzionalmente la compatibilità binaria tra le versioni di Visual Studio (2005, 2008, 2010, 2012).Quando la libreria standard di C++ viene utilizzata, questa vieta la presenza dei file oggetto e librerie statiche compilati utilizzando versioni diverse in un binario (EXE o DLL) e vieta il passaggio di oggetti standard di C++ tra i binari compilati utilizzando versioni diverse.La combinazione dei file oggetto e librerie statiche (tramite la libreria standard di C++) compilato utilizzando Visual C++ 2010 con quelli compilati tramite Visual C++ in Visual Studio 2012 generati errori del linker sulla mancata corrispondenza di _MSC_VER, in cui _MSC_VER è la macro contenente la versione principale del compilatore (1700 per Visual C++ in Visual Studio 2012).Questo controllo non può rilevare la presenza di DLL e non può rilevare la presenza che include Visual C++ 2008 o in precedenza.

  • Oltre a rilevare i dati di _ITERATOR_DEBUG_LEVEL, che è stata implementata in Visual C++ 2010, Visual C++ in Visual Studio 2012 rileva i dati di RuntimeLibrary.Si verificano quando le opzioni del compilatore /MT (versione statica), /MTd (debug statico), /MD (versione dinamica) e /MDd (debug dinamico) vengono combinate.

  • operator<(), operator>(), operator<=()e operator>=() erano disponibili per i gruppi di stdext::hash_map e di std::unordered_map di contenitori, sebbene le implementazioni non siano effettivamente utili.Tali operatori non standard sono stati rimossi in Visual C++ in Visual Studio 2012.Inoltre, l'implementazione di operator==() e operator!=() per la famiglia di std::unordered_map è stata estesa per analizzare la famiglia di stdext::hash_map.(Si consiglia di evitare l'utilizzo della famiglia di stdext::hash_map nel nuovo codice.)

  • C++11 22.4.1.4 locale.codecvt [] specifica che codecvt::length() e codecvt::do_length() devono accettare parametri modificabili di stateT&, ma Visual C++ 2010 richiesto const stateT&.Visual C++ in Visual Studio 2012 accetta stateT& come affidato dallo standard.Questa differenza è appropriato per gli utenti che sta tentando di eseguire l'override della funzione virtuale do_length().

Bb531344.collapse_all(it-it,VS.110).gifLibreria CRT

  • L'heap runtime c (CRT), utilizzata per new e malloc(), non è più privata.CRT ora utilizza l'heap del processo.Ciò significa che l'heap non viene eliminato quando una DLL viene scaricato, pertanto DLL collegate a CRT devono garantire nella memoria allocata dal codice DLL è valida prima che venga scaricato.

  • Asserzioni di funzione di iscsymf() con i valori negativi.

  • La struttura di threadlocaleinfostruct modificato per implementare le modifiche alle funzioni delle impostazioni locali.

  • Le funzioni CRT che hanno intrinseci corrispondenti come memxxx(), strxxx() vengono rimosse da intrin.h.Se intrin.h incluso solo per queste funzioni, è ora è necessario includere le intestazioni CRT corrispondenti.

Bb531344.collapse_all(it-it,VS.110).gifLibrerie MFC e ATL

Supporto rimosso null-coalescing (afxcomctl32.h); pertanto, tutti i metodi definiti in afxcomctl32.h rimossi.I file di intestazione afxcomctl32.h e afxcomctl32.inl eliminati.

Modificato il nome di CDockablePane::RemoveFromDefaultPaneDividier a CDockablePane::RemoveFromDefaultPaneDivider.

Modificata la firma di CFileDialog::SetDefExt per utilizzare LPCTSTR; pertanto, le compilazioni Unicode sono interessati.

Categorie obsolete rimosse di traccia ATL.

Modificata la firma di CBasePane::MoveWindow per accettare un CRectconst.

Modificata la firma di CMFCEditBrowseCtrl::EnableBrowseButton.

m_fntTabs rimosso e m_fntTabsBold da CMFCBaseTabCtrl.

Aggiunge un parametro ai costruttori di CMFCRibbonStatusBarPane.(È un parametro predefinito e pertanto di origine non è interrompendosi).

Aggiunge un parametro al costruttore di CMFCRibbonCommandsListBox.(È un parametro predefinito e pertanto di origine non è interrompendosi).

Ha rimosso AFXTrackMouse API (e relativi alla routine del timer).Utilizzare il TrackMouseEvent API Win32.

Aggiunge un parametro al costruttore di CFolderPickerDialog.(È un parametro predefinito e pertanto di origine non è interrompendosi).

dimensioni della struttura diCFileStatus modificata: Il membro di m_attribute modificato da BYTE al valore DWORD (in base al valore restituito da GetFileAttributes).

CRichEditCtrl e utilizzo MSFTEDIT_CLASS (controllo di CRichEditView RichEdit 4,1) anziché RICHEDIT_CLASS (controllo RichEdit 3,0) nelle compilazioni Unicode.

AFX_GLOBAL_DATA::IsWindowsThemingDrawParentBackground rimosso perché è sempre VERO Windows Vista, Windows 7 e in Windows 8.

AFX_GLOBAL_DATA::IsWindowsLayerSupportAvailable rimosso perché è sempre VERO Windows Vista, Windows 7 e in Windows 8.

AFX_GLOBAL_DATA::DwmExtendFrameIntoClientArearimosso.Chiamata API Windows direttamente in Windows Vista, Windows 7 e in Windows 8.

AFX_GLOBAL_DATA::DwmDefWindowProcrimosso.Chiamata API Windows direttamente in Windows Vista, Windows 7 e in Windows 8.

AFX_GLOBAL_DATA::DwmIsCompositionEnabled rinominato in IsDwmCompositionEnabled per evitare conflitti di nomi.

Identificatori modificati per una serie di timer interni MFC e mossi le definizioni a afxres.h (AFX_TIMER_ID_*).

Modificata la firma del metodo di OnExitSizeMove per corrispondere alla macro di ON_WM_EXITSIZEMOVE:

  • CFrameWndEx

  • CMDIFrameWndEx

  • CPaneFrameWnd

Modificato il nome e la firma di OnDWMCompositionChanged per corrispondere alla macro di ON_WM_DWMCOMPOSITIONCHANGED:

  • CFrameWndEx

  • CMDIFrameWndEx

  • CPaneFrameWnd

Modificata la firma del metodo di OnMouseLeave per corrispondere alla macro di ON_WM_MOUSELEAVE:

  • CMFCCaptionBar

  • CMFCColorBar

  • CMFCHeaderCtrl

  • CMFCProperySheetListBox

  • CMFCRibbonBar

  • CMFCRibbonPanelMenuBar

  • CMFCRibbonRichEditCtrl

  • CMFCSpinButtonCtrl

  • CMFCToolBar ReplaceThisText

  • CMFCToolBarComboBoxEdit

  • CMFCToolBarEditCtrl

  • CMFCAutoHideBar

Modificata la firma di OnPowerBroadcast per corrispondere alla macro di ON_WM_POWERBROADCAST:

  • CFrameWndEx

  • CMDIFrameWndEx

Modificata la firma di OnStyleChanged per corrispondere alla macro di ON_WM_STYLECHANGED:

  • CMFCListCtrl

  • CMFCStatusBar

Ha modificato il metodo interno FontFamalyProcFonts a FontFamilyProcFonts.

( CString statico globale rimosso oggetti per eliminare le perdite di memoria in alcune situazioni (sostituirli con #defines) e le seguenti variabili membro della classe:

  • 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

Modificata la firma di CKeyboardManager::ShowAllAccelerators e ha rimosso il parametro del delimitatore dei tasti di scelta rapida.

CPropertyPage::GetParentSheetaggiunta e nella classe di CPropertyPage, la chiamata anziché GetParent per ottenere la finestra padre corretta del foglio, che può essere il padre o una finestra del padre a CPropertyPage.Potrebbe essere necessario modificare il codice per chiamare GetParentSheet anziché GetParent.

Avviso non fisso #pragma (tramite) in ATLBASE.H, che ha provocato gli avvisi essere disabilitato in modo errato.Tali avvisi sono abilitati correttamente dopo che ATLBASE.H analizzati.

Metodi spostati di D2D-related da AFX_GLOBAL_DATA a _AFX_D2D_STATE:

  • GetDirectD2dFactory

  • GetWriteFactory

  • GetWICFactory

  • InitD2D

  • ReleaseD2DRefs

  • IsD2DInitialized

  • D2D1MakeRotateMatrix

  • Anziché chiamare, ad esempio, afxGlobalData.IsD2DInitialized, chiamata AfxGetD2DState->IsD2DInitialized.

I file obsoleti rimossi di ATL*.CPP da \ atlmfc \ include \.

Inizializzazione spostata di afxGlobalData su richiesta invece in fase CRT di inizializzazione, per rispondere alle esigenze di DLLMain.

È stato aggiunto il metodo di RemoveButtonByIndex alla classe di CMFCOutlookBarPane.

CMFCCmdUsageCount::IsFreqeuntlyUsedCmd corretto a IsFrequentlyUsedCmd.

Correzione di più istanze di RestoreOriginalstate a RestoreOriginalState (CMFCToolBar, CMFCMenuBar, CMFCOutlookBarPane).

Metodi inutilizzati rimossi da CDockablePane: SetCaptionStyle, IsDrawCaption, IsHideDisabledButtons, GetRecentSiblingPaneInfoe CanAdjustLayout.

Variabili membro static rimossi m_bCaptionText e m_bHideDisabledButtonsdi CDockablePane.

Aggiunta di un metodo di DeleteString di override in CMFCFontComboBox.

Metodi inutilizzati rimossi da CPane: GetMinLength e IsLastPaneOnLastRow.

CPane::GetDockSiteRow(CDockingPanesRow *) *)rinominato in CPane::SetDockSiteRow.

Vedere anche

Altre risorse

Introduzione a Visual C++ in Visual Studio 2012