videojuego plataformas peliculas juegos guia gba fantasy descargar c++ gcc c++11 libstdc++

plataformas - C++ 11 compatibilidad con versiones anteriores



final fantasy peliculas (2)

El estándar no ofrece ninguna garantía sobre cualquier cosa que trabaje con implementaciones anteriores. La especificación define los requisitos de una implementación y una implementación cumple con esos requisitos o no. El empalme de partes de una implementación de C ++ 11 con partes de una implementación anterior no es portátil y es poco probable que sea prácticamente posible.

Es posible incluso que escribir un programa que no use la biblioteca estándar y que no use ninguna de las funciones de C ++ 11 no será compatible con ABI con binarios de una implementación de C ++ 03. Por ejemplo, un implementador podría potencialmente aprovechar la nueva versión para cambiar las convenciones de llamada. Entonces, en general, la limitación de un programa a funciones como auto y range-for no necesariamente será compatible con ABI.

¿Cómo puedo saber qué partes de c ++ 11 son parte de libstdc ++. Y qué se compila en el binario?

Incluso si no utiliza ninguna parte de la biblioteca estándar (puede garantizar esto simplemente no utilizando encabezados), esto no garantiza que un binario compilado no requiera soporte en tiempo de ejecución proporcionado por una implementación de C ++ 11. Un par de ejemplos de características de lenguaje que pueden depender del soporte en tiempo de ejecución son las excepciones y los miembros virtuales.

Y nuevamente, el soporte de biblioteca en tiempo de ejecución no es lo único que podría ser incompatible con ABI entre C ++ 03 y C ++ 11.

¿C ++ 11 rompe el cumplimiento ABI con bibliotecas más antiguas?

No, no creo que la especificación requiera algo que impida que las implementaciones de C ++ 03 y C ++ 11 compartan una ABI. Sin embargo, lo que desea saber es si las especificaciones anteriores son lo suficientemente estrictas como para que las implementaciones más antiguas deban tener una ABI que pueda ser compartida por una implementación de C ++ 11 también. La respuesta no es así y, por lo tanto, un implementador puede verse obligado a romper la compatibilidad ABI al implementar C ++ 11.

Una implementación específica de C ++ 03 y C ++ 11 juntos puede ofrecer ciertas garantías sobre la mezcla de un binario compilado en C ++ 11 con el soporte en tiempo de ejecución de C ++ 03, por lo que puede hacer uso de eso. Sin embargo, no sé de tales implementaciones.

Otra opción es que, en lugar de tratar de mezclar las implementaciones de C ++ 11 y C ++ 03, su implementación de C ++ 11 puede crear binarios autocontenidos (o en su mayoría autocontenidos, más bien, ya que al menos tendría que confiar en el sistema del sistema operativo llamado ABI) que no requiere soporte en tiempo de ejecución externo.

La compatibilidad en la que puede confiar es el nivel de origen. Puede escribir programas en C ++ 11 que también se compilan como C ++ 03, y programas en C ++ 03 que también compilan C ++ 11, aunque, por supuesto, con este método usted está limitado al mínimo común denominador entre C ++. 03 y C ++ 11 y sobre la única característica de C ++ 11 de la que podrá beneficiarse sería la semántica de movimientos.

¿Hay algo de c ++ 11 que pueda usar y esperar que los binarios compilados se ejecuten en sistemas más antiguos? ¿Cómo puedo saber qué partes de c ++ 11 son parte de libstdc ++. Y qué se compila en el binario? Tal vez no entiendo completamente cómo funcionan tales cosas. ¿C ++ 11 rompe el cumplimiento ABI con bibliotecas más antiguas?

Un ejemplo de claridad:

Digamos que compilo un programa que usa auto y el nuevo rango basado en bucle. Parece que estas cosas deberían funcionar en sistemas con tiempos de ejecución de c ++ anteriores porque se dividen en c ++ que serían válidas en esas máquinas. Sin embargo, el uso de algo como regex debería interrumpirse en sistemas más antiguos porque no estará en su tiempo de ejecución.

Todavía no he probado mi teoría porque no tengo acceso a un compilador compatible con c ++ 11, y mis búsquedas en Google no han sido útiles.


Estás en lo correcto. El código en sí mismo se compila para funcionar en cualquier plataforma con un compilador de C ++. Las nuevas construcciones de lenguaje (variadas for , nuevas palabras clave como auto , etc.) se compilan con un nuevo compilador para funcionar bien en sistemas más antiguos.

Sin embargo, si intenta vincular un código que usa nuevos símbolos (como regex) a una biblioteca antigua, entonces tiene problemas, no importa si lo vincula de forma estática o dinámica, porque la biblioteca antigua no tiene los nuevos símbolos.

Suponiendo que su código utiliza nuevos símbolos:

  • Si vincula estáticamente a una biblioteca antigua, la conexión fallará porque los nuevos símbolos no existen en la biblioteca antigua.
  • Si vincula dinámicamente a una biblioteca antigua, todavía debería tener problemas con el enlazador, nuevamente porque la biblioteca no contiene los nuevos símbolos.
  • Si vincula estáticamente a una nueva biblioteca, el binario resultante funcionará en un sistema anterior.
  • Si vincula dinámicamente a una nueva biblioteca, el binario resultante funcionará en un sistema más antiguo si ya tiene la nueva biblioteca o si distribuye la nueva biblioteca con su binario.
    • Pero si luego intenta reemplazar la nueva biblioteca dinámica con una antigua biblioteca dinámica, no podrá vincular a los nuevos símbolos en esa biblioteca, nuevamente porque no están allí.