Compartir a través de


Cambios importantes en el compilador de Visual C++ 2005

Actualización: noviembre 2007

Este tema analiza los cambios de comportamiento de Visual C++ 2005 que pueden hacer que el código que funcionaba en una versión anterior no se compile o se comporte de forma diferente en tiempo de ejecución.

Para obtener más información sobre nuevas características, vea Cambios en Visual C++ 2005 y versiones anteriores, Cambios en las bibliotecas de Visual C++ 2005 y Cambios en el compilador, el lenguaje y las herramientas de Visual C++ 2005.

  • El puntero a miembros requiere ahora el nombre completo y &
    El código escrito para versiones anteriores del compilador que simplemente usaba el nombre de método producirá ahora un Error del compilador C3867 o una Advertencia del compilador C4867. El estándar de C++ requiere este diagnóstico. Ahora, para crear un puntero a una función miembro, se debe usar el operador de dirección (&) con el nombre completo del método. No utilizar el operador & y el nombre completo del método puede conducir a errores lógicos en el código debido a la ausencia de paréntesis en las llamadas a funciones. El uso del nombre de la función sin una lista de argumentos produce un puntero a función que se puede convertir a varios tipos. Si este código se compilara, produciría un comportamiento inesperado en tiempo de ejecución.

  • Una clase debe ser accesible para una declaración friend
    Los compiladores de Visual C++ anteriores a Visual C++ 2005 permitían una declaración friend para una clase que no era accesible en el ámbito de la clase que contenía la declaración. Ahora, el compilador producirá un Error del compilador C2248. Para solucionarlo, se debe cambiar la accesibilidad de la clase especificada en la declaración friend. Este cambio se ha realizado para cumplir con el estándar de C++.

  • __int que asm 3 compila ahora a código nativo
    Cuando se compilaba con /clr, __asm int 3 no se generaba código nativo; el compilador traducía la instrucción a una instrucción de interrupción de CLR. En Visual C++ 2005, __asm int 3 ahora genera código nativo para la función. Si desea que una función produzca un punto de interrupción en el código y que la función se compile a código MSIL, use __debugbreak. Para obtener más información, vea __asm y /clr (Compilación de Common Language Runtime). Este cambio se hizo para ser más determinista acerca de cuándo generar código nativo frente a código administrado; el código de ensamblado inline debería generar código nativo.

  • No se permite la especialización explícita como constructor de copias ni como operador de asignación de copia
    El código que depende de una especialización explícita de plantilla para un constructor de copias o un operador de asignación de copia producirá ahora un Error del compilador C2299. El estándar de C++ lo prohíbe. Este cambio se ha realizado por razones de conformidad y para mejorar la portabilidad del código.

  • Una plantilla de clase no especializada no se puede usar como argumento de plantilla en una lista de clases base
    El uso del nombre de una clase de plantilla no especializada en la lista de clases base para una definición de clase dará lugar a un Error del compilador C3203. No se puede usar el nombre de una clase de plantilla no especializada como parámetro de plantilla en una lista de clases base. Se deben agregar explícitamente los parámetros de tipo de plantilla al nombre de clase de plantilla cuando se use como parámetro de plantilla en una lista de clases base. Este cambio se ha realizado por razones de conformidad y para mejorar la portabilidad del código.

  • Ya no se permite una declaración using de tipo anidado
    El código que incluye una declaración using para un tipo anidado dará lugar ahora a un Error del compilador C2885. Para resolver referencias completas a tipos anidados, coloque el tipo en un espacio de nombres o cree un typedef. Este cambio se ha realizado por razones de conformidad y para mejorar la portabilidad del código.

  • El compilador no permite a const_cast realizar una conversión a versiones anteriores en /clr:oldSyntax
    Antes de Visual C++ 2005, el compilador de Visual C++ permitía a const_cast Operator realizar la conversión a versiones anteriores al compilar código fuente que usaba la sintaxis de Extensiones administradas para C++. Realizar una conversión a versiones anteriores con const_cast da lugar ahora a un Error del compilador C2440. Para resolverlo, use el operador de conversión correcto (para obtener más información, vea Casting Operators). Este cambio se realizó por razones de conformidad.

  • El compilador no permite la declaración adelantada de una enumeración administrada
    Antes de Visual C++ 2005, el compilador de Visual C++ permitía declaraciones adelantadas de enumeraciones administradas. Ahora, declarar y no definir una enumeración administrada al compilar con cualquier forma de /clr dará lugar a un Error del compilador C2599. Para resolverlo, defina siempre las enumeraciones administradas en la declaración. Este cambio se realizó debido a que las declaraciones adelantadas de enumeraciones administradas no siempre funcionaban correctamente: el compilador no puede identificar correctamente el tipo subyacente de la enumeración. Además, el estándar de C++ tampoco permite las declaraciones de enumeración.

  • Se quita la opción del compilador /YX
    /YX generaba compatibilidad automática con encabezados precompilados. Se utilizaba de manera predeterminada desde el entorno de desarrollo. Si quita /YX de sus configuraciones de generación y no lo reemplaza por nada, puede producir generaciones más rápidas. Aparte de que es posible que se produzca un comportamiento inesperado con /YX, es preferible usar /Yc (Crear archivo de encabezado precompilado) y /Yu (Utilizar el archivo de encabezado precompilado), que proporcionan más control sobre la forma en que se usan los encabezados precompilados.

  • Se han quitado las opciones del compilador /Oa y /Ow
    Se han quitado las opciones del compilador /Ow y /Oa, pero se pasan por alto sin emitir ningún mensaje o advertencia. Utilice los modificadores noalias, restrict o __declspec para especificar cómo realiza el compilador el efecto escalonado (aliasing).

  • Se quita la opción del compilador /Op
    Se ha quitado la opción del compilador /Op. En su lugar, se ha de utilizar /fp (Especificar comportamiento de punto flotante).

  • Se han quitado las opciones del compilador /ML y /MLd
    Visual C++ ya no admite la compatibilidad con la biblioteca CRT vinculada estáticamente y de un solo subproceso. Use /MT y /MTd en su lugar. Vea C Run-Time Libraries para obtener más información.

  • Se han quitado las opciones del compilador /G3, /G4, /G5, /G6, /G7 y /GB
    El compilador utiliza ahora un modelo mixto que intenta crear el mejor archivo de resultados para todas las arquitecturas.

  • Se ha quitado /Gf
    Use /GF (Eliminar cadenas duplicadas) en su lugar. /GF coloca las cadenas agrupadas en una sección de sólo lectura, que es más segura que la sección de escritura donde las agregaba /Gf.

  • /clr no es compatible con /MT
    La biblioteca de tiempo de ejecución de C no permite vincular estáticamente con una aplicación administrada. Todas las aplicaciones administradas tienen que vincularse dinámicamente (/MD). Para obtener más información sobre las restricciones en el uso de /clr, vea Restricciones de /clr.

  • /GS está ahora habilitada de manera predeterminada
    La comprobación del desbordamiento del búfer está activada de manera predeterminada. Puede desactivar la comprobación de la saturación del búfer con /GS-. Vea /GS (Comprobación de seguridad del búfer) para obtener más información.

  • /Zc:wchar_t está ahora habilitada de manera predeterminada
    Éste es el comportamiento estándar de C++; el valor predeterminado de una variable wchar_t será del tipo integrado en lugar de un entero corto sin signo. Este cambio interrumpirá la compatibilidad binaria cuando el código de cliente se vincule a bibliotecas que se compilaron sin /Zc:wchar_t (LNK2019). En ese caso, use /Zc:wchar_t- para revertir al comportamiento anterior no estándar. Este cambio se ha introducido para crear código compatible de manera predeterminada.

    Para obtener más información, vea /Zc:wchar_t (wchar_t es un tipo nativo).

  • /Zc:forScope está ahora habilitada de manera predeterminada
    Éste es el comportamiento estándar de C++; el código que depende del uso de una variable declarada en un bucle for después de la finalización del ámbito del bucle for ya no se compilará. Use /Zc:forScope- para revertir al comportamiento anterior no estándar. Este cambio se ha introducido para crear código compatible de manera predeterminada.

    Para obtener más información, vea /Zc:forScope (Forzar ajuste en el ámbito del bucle For).

  • Aplicar la comprobación de parámetros para los atributos de Visual C++
    El código que pasa atributos con nombre al constructor de atributos, entre comillas cuando el tipo no es una cadena y sin comillas cuando el tipo es una cadena, dará lugar ahora a un Error del compilador C2065 o una Advertencia del compilador (nivel 1) C4581. Anteriormente, todos los atributos del compilador se analizaban como cadenas y, si era necesario, el compilador insertaba las comillas inexistentes. La compatibilidad con atributos se ha mejorado al agregar la validación de comprobación de parámetros. Esto evitará que se produzca un comportamiento inesperado por pasar argumentos incorrectos a un constructor de atributos.

    Para esta versión, no se puede usar una cadena de caracteres multibyte (MBCS) en un argumento de un atributo que acepte una cadena implícita como argumento, aunque la cadena se encierre entre comillas (si lo hace puede producir un archivo .idl dañado). La solución alternativa es la siguiente:

    #define ARG string_with_MBCS_chars
    [helpstring(ARG)]
    
  • El compilador requiere ahora la misma especificación de plantilla para múltiples declaraciones del mismo tipo
    Si dispone de una declaración adelantada de un tipo para poder crear elementos friend para ese tipo, por ejemplo, la especificación de la plantilla del tipo debe ser la misma en todas las declaraciones para el tipo. De lo contrario, el compilador dará lugar a un Error del compilador C2990.

  • El atributo uuid ya no puede destinarse a tipos administrados
    El atributo uuid (C++ Attributes) se permitía en un atributo definido por el usuario mediante Extensiones administradas para C++, pero ahora dará lugar a un Error del compilador C3451. En su lugar, se ha de utilizar GuidAttribute.

  • Cambio de sintaxis para pasar matrices administradas a atributos personalizados
    El tipo de la matriz ya no se deduce de la lista de inicialización de agregado. Ahora el compilador requiere que se especifique el tipo de la matriz así como la lista de inicializadores. La sintaxis antigua dará lugar ahora a un Error del compilador C3104. Este cambio era necesario debido a que el compilador no siempre podía deducir correctamente el tipo de matriz en la lista de inicializaciones de agregado.

  • El compilador no insertará int como tipo predeterminado en declaraciones
    El código al que le falta el tipo en una declaración ya no utilizará como tipo predeterminado el tipo int y el compilador dará lugar a una Advertencia del compilador C4430 o una Advertencia del compilador (nivel 4) C4431. El estándar de C++ no admite un int predeterminado; este cambio garantiza que se obtenga el tipo que realmente se desea.

  • dynamic_cast ha mejorado la conformidad con el estándar de C++
    La biblioteca de tiempo de ejecución de C hace ahora una comprobación en tiempo de ejecución dynamic_cast para asegurarse de que el tipo en tiempo de compilación de la expresión que se está convirtiendo hace referencia a un subobjeto de clase base pública del tipo de destino de la conversión (para la conversión a versiones anteriores) o del tipo de objeto más derivado (para la conversión cruzada). Para obtener más información, vea Cambios importantes en dynamic_cast.

  • Un valor R no se puede enlazar a una referencia que no es const.
    Un valor R no se puede enlazar a una referencia que no es const. En versiones anteriores de Visual C++, se podía enlazar un valor R a una referencia no const en una inicialización directa. Este código genera ahora una Advertencia del compilador (nivel 1) C4350.

  • Los tipos value ya no tienen un constructor predeterminado disponible. Esto puede hacer que los inicializadores de tipo se ejecuten en diferentes puntos.
    Antes de Visual C++ 2005, los constructores estáticos (inicializadores de tipos) de los tipos de valor se ejecutaban al crear una instancia del tipo de valor. Para garantizar que los constructores estáticos se ejecuten, obtenga acceso a un miembro de datos estático o (sólo para /clr:oldSyntax) defina un constructor de instancia. El hecho de no proporcionar un constructor predeterminado para los tipos de valor se debía a que Common Language Runtime no garantiza siempre la llamada a un constructor predeterminado. Además, al no proporcionar un constructor predeterminado para los tipos de valor, también se mejora el rendimiento.

  • Los tipos de valor a los que se ha aplicado la conversión boxing son ahora de sólo lectura en contextos comprobables (/clr:safe)
    Common Language Runtime ya no permite modificar un tipo de valor al que se ha aplicado conversión boxing cuando se compila un ensamblado comprobable. El compilador ahora da lugar a una Advertencia del compilador C4972 cuando se detecta esto.

    La advertencia C4792 sólo se produce si se cambia el valor del objeto subyacente a través del objeto de valor al que se ha aplicado la conversión boxing. El error no se producirá si cambia una copia del objeto de valor (por ejemplo, cambiando un objeto al que se ha aplicado la conversión boxing).

  • Los tipos nativos son privados de forma predeterminada fuera del ensamblado
    Los tipos nativos no estarán ahora visibles fuera del ensamblado de forma predeterminada. Para obtener más información sobre la visibilidad de tipos fuera del ensamblado, vea Type Visibility. Este cambio se debe principalmente a la necesidad de los programadores de usar otros lenguajes de programación sin distinción entre mayúsculas y minúsculas al hacer referencia a metadatos creados en Visual C++.

  • /clr acepta ahora la nueva sintaxis de CLR para Visual C++
    Antes de Visual C++ 2005, /clr compilaba la sintaxis de Extensiones administradas para C++. /clr compila ahora la nueva sintaxis de CLR y /clr:oldSyntax compila la sintaxis de Extensiones administradas para C++. Para obtener más información sobre /clr, vea /clr (Compilación de Common Language Runtime). Para obtener más información sobre la nueva sintaxis, vea Language Features for Targeting the CLR.

  • /clr ya no compila archivos de código fuente de C
    Antes de Visual C++ 2005, se podían compilar los archivos de código fuente de C con /clr; sin embargo, ahora esto dará como resultado un Error de la línea de comandos D8045. Para resolverlo, cambie la extensión de archivo a .cpp o .cxx, o compile con /TP o /Tp. Vea /Tc, /Tp, /TC, /TP (Especificar el tipo de archivo de código fuente) para obtener más información.

  • Cambios de MSIL al comprobar la igualdad
    Vea Cómo: Probar la igualdad para obtener más información.

Vea también

Referencia

Cambios importantes en el compilador de Visual C++