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++
Parallel 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.
Biblioteca 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().
Biblioteca 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.
Bibliotecas 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.