Compartir a través de


Cambios importantes en Visual C++

En este documento se enumeran los cambios importantes en Visual C++ en Visual Studio 2012.

Compilador de Visual C++

  • En el código compilado utilizando /clr, la palabra clave de enum class define la enumeración de C++. ++11, no una enumeración de (CLR) de Common Language Runtime.Para definir una enumeración de CLR, debe ser explícito sobre su accesibilidad.En el siguiente ejemplo se muestra cómo.

    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()
            );
    } 
    
  • Utilice la palabra clave de template explícitamente para eliminar la ambigüedad de un nombre dependiente (compatibilidad estándar del lenguaje C++).En el ejemplo siguiente, la palabra clave resaltada de plantilla es obligatoria resolver la ambigüedad.Para obtener más información, vea Resolución de nombres para los tipos de Dependientes.

    template <typename X, typename AY> struct Container {
        typedef typename AY::template Rebind<X>::Other AX;
    };
    
  • La expresión constante de float tipo ya no se permite como argumento de plantilla, como se muestra en el ejemplo siguiente.

    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
    
  • Código compilado utilizando la opción de línea de comandos /GS y que tiene apagado- por - una vulnerabilidad puede realizar para procesar la finalización en tiempo de ejecución, como se muestra en el siguiente ejemplo de pseudocódigo.

    char buf[MAX];
    int cch;
    ManipulateString(buf, &cch);
    // ...
    buf[cch] = '\0'; // if cch >= MAX, process will terminate
    
  • La arquitectura predeterminada para las compilaciones de x86 cambia a SSE2; por consiguiente, el compilador puede emitir instrucciones de SSE, y utilizará los registros de XMM para realizar cálculos de coma flotante. Si desea revertir al comportamiento anterior, utilice el marcador del compilador /arch:IA32 para especificar la arquitectura como IA32.

  • El compilador puede emitir advertencias C4703 y C4701 donde no realizó previamente. El compilador solicita comprobaciones más fuertes el uso de variables locales sin inicializar del tipo de puntero.

  • Cuando se especifica la nueva marca /HIGHENTROPYVA del vinculador, Windows 8 suele hacer asignaciones de memoria para devolver una dirección de 64 bits.(Antes de Windows 8, como direcciones más a menudo devueltas de asignaciones que estaban menos de 2 GB). Esto puede exponer los errores de truncamiento de puntero en código existente. De forma predeterminada, este modificador está activado. Para deshabilitar este comportamiento, especifique /HIGHENTROPYVA:NO.

  • El compilador administrado (Visual Basic /C#) también admite /HIGHENTROPYVA para las compilaciones administradas.Sin embargo, en este caso, el modificador /HIGHENTROPYVA está desactivada de forma predeterminada.

Entorno de desarrollo integrado

  • Las siguientes plantillas de proyecto ya no existen:

    • Aplicación de Windows Forms

    • Biblioteca de controles de Windows Forms

  • Aunque recomendamos no crear aplicaciones de Windows Forms en C++/CLI, el mantenimiento de las aplicaciones de la interfaz de usuario de C++/CLI se admite.Si tiene que crear una aplicación de Windows Forms, o cualquier otra aplicación de la interfaz de usuario de .NET, utilice C# o Visual Basic.Uso C++/CLI para fines de interoperabilidad únicamente.

Bibliotecas de Visual C++

Bb531344.collapse_all(es-es,VS.110).gifParallel patterns library y biblioteca de runtime de simultaneidad

La enumeración de SchedulerType de UmsThreadDefault está desusada.La especificación de UmsThreadDefault muestra una advertencia desusada, e internamente mapas de nuevo a ThreadScheduler.

Bb531344.collapse_all(es-es,VS.110).gifBiblioteca de plantillas estándar

  • Después de un cambio importante entre las normas C++98/03 y C++11, mediante argumentos de plantilla explícitos llamar make_pair()(como en make_pair<int, int>(x, y)— no compila normalmente en Visual C++ en Visual Studio 2012.La solución es llamar siempre make_pair() sin plantilla explícita argumento- como en make_pair(x, y).Proporcionar argumentos de plantilla explícitos rechaza el propósito de la función.Si desea obtener un control preciso de tipo resultante, utilice pair en lugar de make_pair(como en pair<short, short>(int1, int2).

  • Otro cambio importante entre las normas C++98/03 y C++11: Cuando Un es implícitamente convertible a b y a b es implícitamente convertible a C, pero A no es implícitamente convertible a C, a C++98/03 y a pair<A, X> permitido Visual C++ 2010 que se convertirán (implícita o explícitamente) a pair<C, X>.(Otro tipo, X, no es de interés aquí, y éste no es específico del primer tipo en pares.) Dado que C++11 y Visual C++ en Visual Studio 2012 detectan que no es implícitamente convertible a C, se quita la conversión de los pares de la resolución de sobrecarga.Éste es un cambio positivo para muchos escenarios.Por ejemplo, sobrecargar func(const pair<int, int>&) y func(const pair<string, string>&), y llamar func() con pair<const char *, const char *> compilarán con este cambio.Sin embargo, este cambio interrumpe el código que dependía de conversiones agresivas de pares.Este código puede corregir normalmente realizando una parte de la conversión explícitamente- para el ejemplo, pasando make_pair(static_cast<B>(a), x) a una función que espera pair<C, X>.

  • Visual C++ 2010 simuló variadic plantilla- para el ejemplo, make_shared<T>(arg1, arg2, argN)— para buscar un límite de 10 argumentos, sellando out sobrecargas y especializaciones con maquinaria de preprocesador.En Visual C++ en Visual Studio 2012, este límite se reduce a 5 argumentos para mejorar los tiempos de compilación y el consumo de memoria del compilador para la mayoría de los usuarios.Sin embargo, puede establecer el límite anterior explícitamente definiendo _VARIADIC_MAX como 10, proyecto- ancho.

  • C++11 17.6.4.3 .1 [macro.]/2 de los nombres prohíbe palabras clave de la macro - izing cuando los encabezados estándar de la biblioteca de C++ se incluyen.Los encabezados ahora emiten errores del compilador si detectan palabras clave de la macro - ized.(La definición de _ALLOW_KEYWORD_MACROS permite que este código se compile, pero desalentamos fuertemente que utilizan). Como excepción, la macro - ized new se permite de manera predeterminada, porque los encabezados se defienden completo mediante #pragma push_macro("new")/#undef new/#pragma pop_macro("new").La definición de _ENFORCE_BAN_OF_MACRO_NEW hace exactamente qué indica su nombre.

  • Para implementar varias optimizaciones y comprobaciones de depuración, la implementación de la biblioteca estándar de C++ interrumpe deliberadamente la compatibilidad binaria entre versiones de Visual Studio (2005, 2008, 2010, 2012).Cuando se utiliza la biblioteca estándar de C++, ésta prohíbe la combinación de los archivos objeto y bibliotecas estáticas que se han compilado con versiones diferentes de un binario (EXE o DLL), y puede pasar de objetos estándar de la biblioteca de C++ entre los archivos binarios que se han compilado con versiones diferentes.El mezclar de archivos objeto y bibliotecas estáticas (mediante la biblioteca estándar de C++) compilado mediante Visual C++ 2010 con los que se compilaron con Visual C++ en Visual Studio 2012 emite errores de vinculador sobre la falta de coincidencia de _MSC_VER, donde es la macro _MSC_VER que contiene la versión principal del compilador (1700 para Visual C++ en Visual Studio 2012).Esta comprobación no puede detectar DLL que combinación, y no puede detectar mezclar que implica Visual C++ 2008 o anterior.

  • Además de detectar que aparezcan discordancias de _ITERATOR_DEBUG_LEVEL, implementada en Visual C++ 2010, Visual C++ en Visual Studio 2012 detecta que aparezcan discordancias de RuntimeLibrary.Aparecen cuando las opciones del compilador /MT (release estático), /MTd (depuración estática), /MD (release dinámico), y /MDd (depuración dinámica) se mezclan.

  • operator<(), operator>(), operator<=(), y operator>=() eran disponibles para las familias de std::unordered_map y de stdext::hash_map de contenedores, aunque sus implementaciones no se realmente útiles.Se han quitado estos operadores no estándar en Visual C++ en Visual Studio 2012.Además, la implementación de operator==() y operator!=() para la familia de std::unordered_map se ha mejorado para cubrir a la familia de stdext::hash_map.(Se recomienda evitar el uso de la familia de stdext::hash_map en nuevo código).

  • C++11 22.4.1.4 [locale.codecvt] especifica que codecvt::length() y codecvt::do_length() deben tomar parámetros modificables de stateT&, sólo Visual C++ 2010 tardó const stateT&.Visual C++ en Visual Studio 2012 toma stateT& como asignado por mandato por el estándar.Esta diferencia es importante para cualquier persona que está intentando reemplazar la función virtual do_length().

Bb531344.collapse_all(es-es,VS.110).gifBiblioteca de CRT

  • El montón en tiempo de ejecución de C (CRT), que se utiliza para new y malloc(), ya no es privada.CRT utiliza ahora la pila de proceso.Esto significa que la pila no está destruida cuando se descarga la DLL, por lo que los archivos DLL que se vinculan a CRT deben garantizar estáticamente memoria se limpiar que está asignada por el código de DLL antes de que se haya descargado.

  • La función de iscsymf() aserciones con valores negativos.

  • Struct de threadlocaleinfostruct ha cambiado para acomodar los cambios a las funciones de la configuración regional.

  • Funciones que obtienen intrínseco correspondientes como memxxx(), strxxx() CRT se quitan de intrin.h.Si se intrin.h incluido sólo para estas funciones, ahora debe incluir los encabezados correspondientes de CRT.

Bb531344.collapse_all(es-es,VS.110).gifBibliotecas MFC y ATL

Compatibilidad quitado de Fusión (afxcomctl32.h); por consiguiente, se han quitado todos los métodos que se definen en afxcomctl32.h.Se han eliminado los archivos de encabezado afxcomctl32.h y afxcomctl32.inl.

Cambia el nombre de CDockablePane::RemoveFromDefaultPaneDividier a CDockablePane::RemoveFromDefaultPaneDivider.

Ha cambiado la firma de CFileDialog::SetDefExt para utilizar LPCTSTR; por consiguiente, las compilaciones de Unicode se ven afectadas.

Categorías obsoleto quitadas de seguimiento de ATL.

Ha cambiado la firma de CBasePane::MoveWindow para tomar una constante CRect.

Ha cambiado la firma de CMFCEditBrowseCtrl::EnableBrowseButton.

m_fntTabs quitado y m_fntTabsBold de CMFCBaseTabCtrl.

Agregar un parámetro a los constructores de CMFCRibbonStatusBarPane.(Es un parámetro predeterminado y, por lo que origen- no está colocando.)

Agregar un parámetro al constructor de CMFCRibbonCommandsListBox.(Es un parámetro predeterminado y, por lo que origen- no está colocando.)

Quitado AFXTrackMouse API (y relacionados a los procedimiento timer).Utilice Win32 TrackMouseEvent API en su lugar.

Agregar un parámetro al constructor de CFolderPickerDialog.(Es un parámetro predeterminado y, por lo que origen- no está colocando.)

tamaño de la estructura de CFileStatus cambiado: El miembro de m_attribute cambiado de BYTE a DWORD (coincidir con el valor que se devuelve de GetFileAttributes).

CRichEditCtrl y uso MSFTEDIT_CLASS (control de CRichEditView RichEdit 4,1) en lugar de RICHEDIT_CLASS (control RichEdit 3,0) en las compilaciones de Unicode.

AFX_GLOBAL_DATA::IsWindowsThemingDrawParentBackground quitado porque siempre es TRUE en Windows Vista, Windows 7, y Windows 8.

AFX_GLOBAL_DATA::IsWindowsLayerSupportAvailable quitado porque siempre es TRUE en Windows Vista, Windows 7, y Windows 8.

AFX_GLOBAL_DATA::DwmExtendFrameIntoClientArea quitado.Llamar a las API de Windows directamente en Windows Vista, Windows 7, y Windows 8.

AFX_GLOBAL_DATA::DwmDefWindowProc quitado.Llamar a las API de Windows directamente en Windows Vista, Windows 7, y Windows 8.

AFX_GLOBAL_DATA::DwmIsCompositionEnabled cambiado a IsDwmCompositionEnabled para eliminar la colisión de nombre.

Identificadores cambiados para varios temporizadores de MFC internos y no las definiciones a afxres.h (AFX_TIMER_ID_*).

Ha cambiado la firma del método de OnExitSizeMove para que coincida con la macro de ON_WM_EXITSIZEMOVE:

  • CFrameWndEx

  • CMDIFrameWndEx

  • CPaneFrameWnd

Cambia el nombre y la firma de OnDWMCompositionChanged para que coincida con la macro de ON_WM_DWMCOMPOSITIONCHANGED:

  • CFrameWndEx

  • CMDIFrameWndEx

  • CPaneFrameWnd

Ha cambiado la firma del método de OnMouseLeave para que coincida con la macro de ON_WM_MOUSELEAVE:

  • CMFCCaptionBar

  • CMFCColorBar

  • CMFCHeaderCtrl

  • CMFCProperySheetListBox

  • CMFCRibbonBar

  • CMFCRibbonPanelMenuBar

  • CMFCRibbonRichEditCtrl

  • CMFCSpinButtonCtrl

  • CMFCToolBar ReplaceThisText

  • CMFCToolBarComboBoxEdit

  • CMFCToolBarEditCtrl

  • CMFCAutoHideBar

Ha cambiado la firma de OnPowerBroadcast para que coincida con la macro de ON_WM_POWERBROADCAST:

  • CFrameWndEx

  • CMDIFrameWndEx

Ha cambiado la firma de OnStyleChanged para que coincida con la macro de ON_WM_STYLECHANGED:

  • CMFCListCtrl

  • CMFCStatusBar

Encuentra el método interno FontFamalyProcFonts a FontFamilyProcFonts.

Objetos estáticos globales numerosos quitar de CString para eliminar las pérdidas de memoria en algunas situaciones (reemplazado con directivas #define), y las siguientes variables miembro de clase:

  • 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

Ha cambiado la firma de CKeyboardManager::ShowAllAccelerators y quitó el parámetro de delimitador de aceleradores.

CPropertyPage::GetParentSheet agregado y, en la clase de CPropertyPage, llama en lugar de GetParent para obtener la ventana primaria correcta de hoja, que puede ser el elemento primario o una ventana primario principal a CPropertyPage.Puede que tenga que cambiar el código para llamar a GetParentSheet en lugar de GetParent.

Advertencia desequilibrada fija #pragma (inserción) en ATLBASE.H, que produjo advertencias de deshabilitar incorrectamente.Esas advertencias ahora están habilitados correctamente después de que se ha analizado ATLBASE.H.

Métodos cambiará de D2D-related de AFX_GLOBAL_DATA a _AFX_D2D_STATE:

  • GetDirectD2dFactory

  • GetWriteFactory

  • GetWICFactory

  • InitD2D

  • ReleaseD2DRefs

  • IsD2DInitialized

  • D2D1MakeRotateMatrix

  • En lugar de la llamada, por ejemplo, afxGlobalData.IsD2DInitialized, llamada AfxGetD2DState->IsD2DInitialized.

Archivos obsoletos se quitan de ATL*.CPP de \ de atlmfc \ include \.

Inicialización movió de afxGlobalData a petición en lugar de en el momento de la inicialización de CRT, para satisfacer los requisitos de DLLMain.

Agregado el método de RemoveButtonByIndex a la clase de CMFCOutlookBarPane.

CMFCCmdUsageCount::IsFreqeuntlyUsedCmd corregido a IsFrequentlyUsedCmd.

Se ha corregido varias instancias de RestoreOriginalstate a RestoreOriginalState (CMFCToolBar, CMFCMenuBar, CMFCOutlookBarPane).

Los métodos no usados quitar de CDockablePane: SetCaptionStyle, IsDrawCaption, IsHideDisabledButtons, GetRecentSiblingPaneInfo, y CanAdjustLayout.

Variables miembro estáticas quitadas m_bCaptionText y m_bHideDisabledButtons de CDockablePane.

Se ha agregado un método de DeleteString de reemplazo a CMFCFontComboBox.

Los métodos no usados quitar de CPane: GetMinLength y IsLastPaneOnLastRow.

CPane::GetDockSiteRow(CDockingPanesRow *) *)cambiado a CPane::SetDockSiteRow.

Vea también

Otros recursos

Introducción a Visual C++ en Visual Studio 2012