En C++, si escribo un juego simple como pong usando Linux, ¿se puede compilar ese mismo código en Windows y OSX? ¿Dónde puedo saber que no se podrá compilar?¿Qué tan portátil es C++?
Respuesta
Puede leer el estándar: si un programa respeta el estándar, debe ser compilable en todas las plataformas que tengan un compilador compatible con C++.
En cuanto a las bibliotecas de terceros que pueda estar utilizando, la disponibilidad de la plataforma generalmente se especifica en la documentación.
Cuando la GUI se cuestiona, hay opciones multiplataforma (como QT), pero probablemente debería preguntarse: ¿realmente quiero la portabilidad cuando se trata de la interfaz de usuario? A veces, es mejor tener la parte GUI específica de la plataforma.
Por supuesto, no hay compiladores que cumplan con los estándares [solía haber uno, pero luego el estándar cambió], más la multitud de comportamientos definidos en la implementación, por lo que "respetar el estándar" es solo el primer paso. –
C++ es ultra portátil y tiene compiladores disponibles en más plataformas de las que puedes agitar. Los lenguajes como Java suelen promocionarse como multiplataforma masiva, irónicamente, de hecho, generalmente se implementan en C++, o C.
Eso cubre la "portabilidad". Si realmente quiere decir que la plataforma cruzada es C++, entonces no tanto: el estándar C++ solo define una biblioteca IO adecuada para la consola IO, es decir, basada en texto, por lo que tan pronto como desee desarrollar algún tipo de GUI, va a necesitar para usar un marco de GUI, y los marcos de GUI son históricamente muy específicos de la plataforma. Windows tiene ahora múltiples marcos de GUI "nativos": el marco C++ disponible de Microsoft sigue siendo MFC, que envuelve la API Win32 nativa, que es una API de C. (WPF y WinForms están disponibles para CLR C++).
El marco de la GUI de Apple Mac se llama Cocoa, y es una biblioteca Object-C, pero es fácil acceder al Objective C desde C++ en ese entorno de desarrollo.
En Linux existen los frameworks GTK + y Qt que en realidad están portados a Windows y Apple, por lo que uno de estos frameworks C++ puede resolver su "cómo escribir una aplicación GUI en C++ una vez que se compila y ejecuta en windows, apple mac y linux ".
Por supuesto, es difícil considerar Qt como estrictamente C++ - Qt define un marcado especial para señales y ranuras que requiere un paso de compilación de precompilación.
Incluso la E/S de texto es difícil de implementar si necesita caracteres que no sean ASCII. – dan04
Excavar en Java porque está implementado en C++ es una pista falsa. Perl, Python y Ruby están escritos en C, pero son mucho más portátiles y C sigue siendo una pesadilla para codificar multiplataforma. – Schwern
También hay un compilador de palos, aunque la agitación no es atómica y debe observar el uso de la memoria. – ssube
Si está pensando en trasladar de Linux a Windows, usar OPENGL
para la parte gráfica le da libertad para ejecutar su programa en ambos sistemas operativos siempre que no utilice ninguna funcionalidad específica del sistema.
Tiene tres obstáculos principales de portabilidad.
El primero, y el más simple, es escribir el código C++ que entienden todos los compiladores de destino. Nota: esto es diferente de escribir en el estándar de C++. El problema con "escribir en el estándar" comienza con: ¿qué estándar? ¿Tienes C++98, C++03, C++TR1 or C++11? Estas son todas las revisiones de C++ y la más nueva que use, es probable que sean los compiladores menos compatibles. C++ es muy grande y, de manera realista, lo mejor que puede esperar es C++ 98 con algunas características de C++ 03.
Todos los compiladores agregan sus propias extensiones, y es muy fácil usarlas sin saberlo. Sería prudente escribir en el estándar y no en la documentación del compilador. Algunos compiladores tienen un modo "estricto" en el que desactivarán todas las extensiones. Sería prudente hacer un desarrollo primario en el compilador que tiene la mayor cantidad de restricciones y el mejor cumplimiento estándar. gcc
tiene la familia de banderas -Wstrict
para activar advertencias estrictas. -ansi
eliminará las extensiones que entren en conflicto con el estándar. -std=c++98
le dirá al compilador que trabaje en contra del estándar C++ 98 y elimine las extensiones GNU C++.
Con esto en mente, para mantenerse sano debe limitarse a un puñado de compiladores. Incluso escribir una biblioteca C relativamente simple para compiladores múltiples es difícil. Afortunadamente, tanto Linux como OS X usan gcc. Windows tiene Visual C++, pero las versiones diferentes se parecen más a una familia en disputa que a un único compilador cuando se trata de compatibilidad (con el estándar o entre sí), por lo que tendrá que elegir una o dos versiones para admitir. Alternativamente, puede usar uno de los entornos de compilador derivados de gcc como MinGW.
Siguiente es su biblioteca de gráficos y sonido. No solo debe ser multiplataforma, debe verse bien y ser rápido en todas las plataformas. En estos días hay muchas posibilidades, Simple DirectMedia Layer es uno. Tendrás que elegir a qué nivel quieres codificar. ¿Quieres un control detallado? ¿O quieres un motor para encargarse de las cosas? There's an existing answer for this así que no entraré en detalles. Asegúrese de elegir uno que se dedique a ser multiplataforma, no solo funcione. Los errores de compatibilidad en su biblioteca de gráficos pueden hundir su proyecto rápidamente.
Finalmente, existen las incompatibilidades simples que existen entre los sistemas operativos. El cumplimiento de POSIX ha recorrido un largo camino, y tiene suerte de que tanto Linux como OS X sean Unix bajo el capó, pero Windows siempre será el hombre extraño. Las cosas que probablemente te morderán en su mayoría tienen que ver con el sistema de archivos. Aquí hay un puñado:
- diseño del sistema de archivos sintaxis de la vía
- archivo (es decir, C:. \ Foo \ bar vs/foo/bar)
- Mandatory Windows file locking
- Diferentes permisos de archivo sistemas
- distintos modelos de comunicación entre procesos (es decir, horquilla, memoria compartida, etc.)
- Modelos de subprocesamiento diferentes (la biblioteca de gráficos debe suavizar esto)
Ahí lo tienes. Qué desastre, ¿eh? La programación multiplataforma es tanto un estado mental y una declaración de propósito como una técnica. Requiere dedicación y tiempo extra. Hay algunas cosas que puede hacer para que el proceso sea menos agotadora ...
- Encienda todas las restricciones y advertencias y fijarlos
- desactivar todas las extensiones de lenguaje
- de compilación periódicamente y prueba de Windows , no sólo al final
- Get programador que le gusta Windows en el proyecto
- restringirse a tan pocos compiladores como se puede
- Elija un maintaine así d, bien apoyado biblioteca de gráficos
- plataforma Aislar código específico (por ejemplo, en una subclase)
- Tratar de Windows como un ciudadano de primera clase
Lo más importante es hacer todo esto desde el principio. La portabilidad no es algo que se desata al final. No solo su código, pero su diseño completo puede volverse imposible de usar si no está atento.
'Lo bueno de los estándares es que tienes tantos para elegir. ;-) – Voo
Comparado con C, la portabilidad de C++ es extremadamente limitada, si no completamente inexistente.Por un lado, no puede deshabilitar excepciones (así puede hacerlo), ya que el estándar dice específicamente que es un comportamiento indefinido. Muchos dispositivos ni siquiera admiten excepciones. Entonces, para eso, C++ es portátil ZERO. Además de ver el UB, obviamente es un no-go para los sistemas de tiempo real de alto rendimiento y cero fallos en los que las excepciones son tabú: el comportamiento indefinido no tiene cabida en el entorno de falla cero. Luego está el nombre "mangle" que la mayoría, si no todos, el compilador hace completamente diferente. Para una buena portabilidad e intercompatibilidad, Extern debería usar "C" para exportar símbolos, sin embargo, esto hace que cualquier y toda la información del espacio de nombres quede completamente vacía, dando como resultado símbolos duplicados. Por supuesto, se puede optar por no usar espacios de nombres y usar nombres de símbolos únicos. Sin embargo, otra característica de C++ se anuló. Luego está la complejidad del lenguaje, lo que resulta en dificultades de implementación en los diversos compiladores para varias arquitecturas. Debido a estas dificultades, la verdadera portabilidad se convierte en un problema. Uno puede resolver esto teniendo una gran cadena de directivas de compilación/# ifdefs/macros. ¿Plantillas? Ni siquiera es compatible con la mayoría de los compiladores.
¿Qué portabilidad? ¿Te refieres a la semi portabilidad entre un par de objetivos de compilación de flujo principal como MSVC para Windows y GCC para Linux? Incluso allí, en ese segmento MAIN-STREAM, existen todos los problemas y limitaciones anteriores. Está retrasado incluso para pensar que C++ es portátil.
La mayoría de los puntos que expones no están relacionados con la pregunta: *" ¿Puedo compilar un código compatible con C++ en una plataforma diferente? "* y la respuesta a esa pregunta adolece de ** ninguna ** de las cuestiones que usted describió. No puede (y no) deshabilitar excepciones, porque entonces ya no sería C++. El cambio de nombres tampoco es un problema. Es un contrato entre el compilador y el vinculador, y estarán de acuerdo con cualquier cadena de herramientas dada. ¿Falta soporte de plantilla? Uhm ... sí. Eso fue el último milenio. – IInspectable
- 1. ¿Qué tan portátil es GLib?
- 2. ¿Qué tan portátil es mktemp (1)?
- 3. ¿Qué tan portátil es el código de Silverlight para WPF?
- 4. ¿Qué tan escalable es Jetty?
- 5. ¿Qué tan útil es C#? ¿operador?
- 6. cómo portátil es mmap
- 7. ¿Qué es una biblioteca de clases portátil?
- 8. ¿Qué es un valor portátil para UINT_MIN?
- 9. Portátil C++ IDE
- 10. ¿Qué tan aleatorio es urandom?
- 11. ¿Qué tan confiable es HtmlUnitDriver?
- 12. ¿Qué tan confiable es HTTP_REFERER?
- 13. ¿Qué tan confiable es HTTP_HOST?
- 14. ¿Qué tan estable es WPF?
- 15. ¿Qué tan bueno es SecRandomCopyBytes?
- 16. ¿Qué tan útil es Response.IsClientConnected?
- 17. Qué tan lento es Reflection
- 18. ¿Qué tan estable es NSubstitute?
- 19. ¿Qué tan eficiente es javascript?
- 20. ¿Qué tan persistente es localStorage?
- 21. ¿Qué tan confiable es current_kernel_time()?
- 22. ¿Qué tan bueno es startswith?
- 23. ¿Qué tan único es LINQ?
- 24. ¿Qué tan escalable es System.Threading.Timer?
- 25. ¿Qué tan aleatorio es Random.Next()?
- 26. ¿Qué tan escalable es ZeroMQ?
- 27. ¿Qué tan bueno es VTK?
- 28. ¿Qué tan seguro es javax.crypto.Cipher?
- 29. ¿Qué tan seguro es PHP?
- 30. ¿Qué tan eficaz es StackFrame?
que depende de qué bibliotecas/funciones usa exactamente y si están disponibles para todas las plataformas ... – Yahia