Cambios importantes en Visual C++

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

Compilador de Visual C++

  • La palabra clave auto tiene un nuevo significado predeterminado. Dado que el uso del significado antiguo es poco habitual, la mayoría de las aplicaciones no se verán afectadas por este cambio.

  • Se incluye la nueva palabra clave static assert, que generará un conflicto de nombres si ya existe un identificador con ese nombre en el código.

  • La compatibilidad con la nueva notación lambda excluye la compatibilidad para codificar un GUID sin comillas en un atributo uuid de IDL.

  • .NET Framework 4 presenta el concepto de excepciones de estado dañado, que son excepciones que dejan un proceso en estado dañado e irrecuperable. De forma predeterminada, una excepción de estado dañado no se puede detectar, ni siquiera con la opción del compilador /EHa, que detecta todas las demás excepciones.

    Para detectar una excepción de estado dañado de forma explícita, use instrucciones __try-__except. También puede aplicar el atributo [HandledProcessCorruptedStateExceptions] a fin de habilitar una función para detectar las excepciones de estado dañado.

    Este cambio afecta principalmente a los programadores de sistemas que puede que tengan que detectar una excepción de estado dañado. Las ocho excepciones son STATUS_ACCESS_VIOLATION, STATUS_STACK_OVERFLOW, EXCEPTION_ILLEGAL_INSTRUCTION, EXCEPTION_IN_PAGE_ERROR, EXCEPTION_INVALID_DISPOSITION, EXCEPTION_NONCONTINUABLE_EXCEPTION, EXCEPTION_PRIV_INSTRUCTION y STATUS_UNWIND_CONSOLIDATE. Para obtener más información sobre estas excepciones, vea la macro GetExceptionCode.

  • La opción del compilador /GS revisada protege frente a saturaciones del búfer de forma más exhaustiva que en versiones anteriores. Esta versión puede insertar comprobaciones de seguridad adicionales en la pila que podrían disminuir el rendimiento. Use la nueva palabra clave __declspec(safebuffers) para indicar al compilador que no inserte comprobaciones de seguridad para una función determinada.

  • Si compila con las opciones de compilador /GL (Optimización de todo el programa) y /clr (Compilación de Common Language Runtime), se omite la opción /GL. Este cambio se realizó porque la combinación de opciones del compilador resultaba poco ventajosa. Como resultado de este cambio, se mejora el rendimiento de la compilación.

  • De forma predeterminada, la compatibilidad con los trígrafos está deshabilitada en Visual C++ 2010. Use la opción del compilador /Zc:trigraphs para habilitar la compatibilidad con trígrafos. Un trígrafo se compone de dos signos de interrogación consecutivos ("??") seguidos de un tercer carácter único. El compilador reemplaza un trígrafo por el carácter de puntuación correspondiente. Por ejemplo, el compilador reemplaza el trígrafo "??=" por el carácter "#" (almohadilla). Use trígrafos en los archivos de origen de C que usen un juego de caracteres que no contenga representaciones gráficas adecuadas para algunos caracteres de puntuación.

  • El vinculador ya no admite la optimización para Windows 98. La opción /OPT (Optimizaciones) produce un error en tiempo de compilación si se especifica /OPT:WIN98 o /OPT:NOWIN98.

  • Se han cambiado las opciones predeterminadas de compilador que se especifican en las propiedades del sistema de compilación RuntimeLibrary y DebugInformationFormat. De manera predeterminada, estas propiedades de compilación se especifican en proyectos creados entre las versiones 7.0 a 10.0 de Visual C++. Si migra un proyecto creado en Visual C++ 6.0, determine si va a especificar o no un valor para estas propiedades.

    En Visual C++ 2010, RuntimeLibrary = MultiThreaded (/MD) y DebugInformationFormat = ProgramDatabase (/Zi). En Visual C++ 9.0, RuntimeLibrary = MultiThreaded (/MT) y DebugInformationFormat = Disabled.

Common Language Runtime (CLR)

  • Los compiladores de Microsoft C# y Visual Basic ahora pueden generar un ensamblado de interoperabilidad no primario (no-PIA). Un ensamblado de tipo no-PIA puede usar los tipos COM sin la implementación del ensamblado de interoperabilidad primario pertinente (PIA). Al usar ensamblados de tipo no-PIA generados por Visual C# o Visual Basic, debe hacer referencia al ensamblado de interoperabilidad primario en el comando de compilación antes de hacer referencia a cualquier ensamblado de tipo no-PIA que use la biblioteca.

Proyectos de Visual C++ y MSBuild

  • Ahora los proyectos de Visual C++ se basan en la herramienta MSBuild. Por tanto, los archivos del proyecto usan un nuevo formato de archivo XML y un sufijo de archivo .vcxproj. Visual C++ 2010 convierte automáticamente los archivos del proyecto de versiones anteriores de Visual Studio al nuevo formato de archivo.

    Un proyecto existente se ve afectado si depende de la herramienta de compilación VCBUILD.exe o del sufijo de archivo de proyecto .vcproj anteriores.

  • En versiones anteriores, Visual C++ proporcionaba la evaluación en tiempo de ejecución de las hojas de propiedades. Por ejemplo, una hoja de propiedades primaria podía importar una hoja de propiedades secundaria y el elemento primario podía usar una variable definida en el elemento secundario para definir otras variables. La evaluación en tiempo de ejecución permitía que el elemento primario usara la variable secundaria incluso antes de que se importara la hoja de propiedades secundaria. En Visual C++ 2010, una variable de hoja de proyecto no se puede usar antes de definirse porque MSBuild solo admite la evaluación en tiempo de ejecución.

Entorno de desarrollo integrado

  • El cuadro de diálogo de finalización de una aplicación ya no finaliza las aplicaciones.

    En versiones anteriores, cuando la función abort() o terminate() cerraba la versión comercial de una aplicación, la biblioteca en tiempo de ejecución de C mostraba un mensaje de finalización de la aplicación en una ventana de consola o un cuadro de diálogo. Parte del mensaje decía: "Esta aplicación solicitó la finalización del tiempo de ejecución de modo no habitual. Póngase en contacto con el equipo de asistencia técnica de la aplicación para obtener más información.".

    El mensaje de finalización de la aplicación era redundante porque, a continuación, Windows mostraba el controlador de terminación habitual, que solía ser el cuadro de diálogo Informe de errores de Windows (Dr. Watson) o el depurador de Visual Studio. A partir de Visual Studio 2010, la biblioteca en tiempo de ejecución de C no muestra el mensaje. Además, el runtime impide que la aplicación finalice antes de que se inicie un depurador.

    Este cambio solo es importante si depende del comportamiento anterior del mensaje de finalización de la aplicación.

  • Específicamente para Visual Studio 2010, IntelliSense no funciona con los atributos o el código de C++/CLI, Buscar todas las referencias no funciona con las variables locales y el modelo de código no recupera los nombres de tipo de ensamblados importados ni resuelve los tipos a sus nombres completos.

Bibliotecas de Visual C++

  • La clase SafeInt está incluida en Visual C++ y ya no constituye una descarga independiente. Este cambio solo es importante si ha desarrollado una clase también denominada "SafeInt".

  • El modelo de implementación de las bibliotecas ya no usa manifiestos para buscar una versión determinada de una biblioteca de vínculos dinámicos. En su lugar, dado que el nombre de cada biblioteca de vínculos dinámicos contiene su número de versión, puede utilizarse ese nombre para buscar la biblioteca. Para obtener más información, vea Implementación en Visual C++ 2010.

  • En versiones anteriores de Visual Studio, podía recompilar las bibliotecas en tiempo de ejecución. Visual C++ 2010 ya no le permite compilar sus propias copias de los archivos de la biblioteca de C en tiempo de ejecución.

Biblioteca de plantillas estándar

  • Muchos archivos de encabezado ya no incluyen automáticamente el encabezado <iterator>. En su lugar, debe incluir ese encabezado explícitamente si necesita compatibilidad con los iteradores independientes definidos en el encabezado <interator>.

  • En el encabezado <algorithm>, se han quitado las funciones checked_* y unchecked_*. Y en el encabezado <iterator>, se ha quitado la clase checked_iterator y se ha agregado la clase unchecked_array_iterator.

  • El constructor CComPtr::CComPtr(int) se ha quitado. Ese constructor permitía que se construyera un objeto CComPtr a partir de la macro NULL, pero resultaba innecesario y permitía construcciones incongruentes a partir de enteros distintos de cero.

    Todavía se puede construir un objeto CComPtr a partir de NULL, que se define como 0, pero producirá un error si se construye a partir de otro entero que no sea el literal 0. Lo más probable es que esta problema se produzca en el escenario que se describe en el siguiente seudocódigo.

    pair<X, CComPtr<T>> myVar;
    myVar = make_pair(x, NULL);
    

    Para corregir la segunda instrucción, use la palabra clave nullptr en lugar de la macro NULL.

    myVar = make_pair(x, nullptr)
    
  • Se han quitado las siguientes funciones miembro de ctype: ctype::_Do_narrow_s, ctype::_Do_widen_s, ctype::_narrow_s y ctype::_widen_s. Si una aplicación utiliza una de estas funciones miembro, debe reemplazarla con la versión no segura correspondiente: ctype::do_narrow, ctype::do_widen, ctype::narrow, ctype::widen.

Bibliotecas CRT, MFC y ATL

  • Se ha quitado la compatibilidad de los usuarios para compilar las bibliotecas CRT, MFC y ATL. Por ejemplo, no se proporciona un archivo nmake adecuado. Sin embargo, los usuarios siguen teniendo acceso al código fuente de estas bibliotecas. Además, probablemente se expondrá un documento que describe las opciones de MSBuild que usa Microsoft para compilar estas bibliotecas en un blog del equipo de Visual C++.

  • Se ha quitado la compatibilidad de MFC con IA64. Sin embargo, aún se proporciona compatibilidad con CRT y ATL en IA64.

  • Los ordinales ya no se reutilizan en los archivos de definición de módulo (.def) de MFC. Este cambio significa que los ordinales no serán distintos entre las versiones secundarias y se mejorarán tanto la compatibilidad binaria con los Service Pack como las versiones de ingeniería de corrección rápida.

  • Se agregó una nueva función virtual a la clase CDocTemplate. Esta nueva función virtual es CDocTemplate::OpenDocumentFile. La versión anterior de OpenDocumentFile tenía dos parámetros. La nueva versión tiene tres parámetros. Para admitir el administrador del reinicio, cualquier clase derivada de CDocTemplate debe implementar la versión que tiene tres parámetros. Para obtener más información sobre la función, vea CDocTemplate::OpenDocumentFile. El nuevo parámetro es bAddToMRU.

Variables de entorno y macros

  • La variable de entorno __MSVCRT_HEAP_SELECT ya no se admite. Esta variable de entorno se quita y no se reemplaza.

Referencia de Microsoft Macro Assembler

Vea también

Otros recursos

Introducción a Visual C++ 2010