¿Cuáles son las cosas que debo tener en cuenta para escribir código portátil? Como soy un principiante en C ++, quiero practicarlo desde el principio.
Gracias.
Mantenga el código específico de la plataforma separado del código reutilizable, preferiblemente en un archivo diferente, pero al menos en una función diferente. Si comienza a tener #if WIN32
y #if CYGWIN
y #if BSD
todas partes, tendrá una pesadilla de mantenimiento.
Luego, comstack al menos dos plataformas diferentes temprano y con frecuencia. Las opciones típicas son Visual C ++ en Windows y gcc en Linux. Dado que ni las bibliotecas del sistema ni el comstackdor se comparten, se detectará el código no portátil antes de que se arraigue profundamente en su diseño.
¿Cuáles son las cosas que debo tener en cuenta para escribir código portátil?
Escriba los progtwigs de línea de comando para comenzar. Cuando esté listo, busque un juego de herramientas de ventanas multiplataforma como Qt .
Si está interesado en escribir código multilingüe, use una biblioteca Unicode de terceros, como ICU, en lugar de confiar en las bibliotecas específicas de la plataforma.
Use los tipos de STL cuando sea posible. Tenga cuidado al usar tipos y API dependientes del sistema. Por ejemplo, no use tipos como UINT y DWORD en Windows.
Puede usar una biblioteca como refuerzo para que le sea más fácil escribir código portátil. Si necesita una GUI, considere usar un conjunto de herramientas multiplataforma como Qt.
Algunas veces necesitará escribir un código específico para la plataforma, y en esos casos puede hacer algo como esto:
#ifdef _WIN32 #include #else #include #endif
El progtwigdor incauto es probable que entre en un montón de trampas, que podemos intentar categorizar. Pero déjame decirte primero: como un absoluto es imposible.
El problema es que incluso el código de conformidad estándar podría no ser portátil debido a un problema particular del comstackdor.
Ahora estas son las principales categorías que puedo pensar en la parte superior de mi cabeza.
Extensiones del comstackdor
Como por ejemplo el uso de matrices de variables:
void func(int const n) { int array[n]; }
Esto no es estándar, pero muchos comstackdores lo admiten, no obstante, porque es simplemente práctico.
Extensiones de bibliotecas estándar
Muchas implementaciones de bibliotecas estándar proporcionan un std::hash_map
que nunca se especificó. Si lo usa en su código, no es portátil.
La tendencia moderna es esconder esto en el std::tr1
nombres std::tr1
para que los progtwigdores sepan que se trata de una extensión.
También tenga en cuenta que muchos definen typedef
o macros que no son generics (por ejemplo, PRETTY_FUNCTION
). El estándar no especifica ninguna macro, y muy pocos typedef son.
Plataforma específica
Por ejemplo, el tamaño y la alineación de int
o double
no están especificados en el estándar. Si haces bit-twiddling y esperas que tenga 32 bits, estarás atornillado a las plataformas de 64 bits incluso sin cambiar tu comstackdor.
Plataforma API
Nuestros progtwigs están destinados a comstackrse y, a menudo, están destinados a interactuar con la computadora en la que se ejecutan:
Debe encontrar las API portátiles multiplataforma o hacer las suyas propias. Verifique algunas bibliotecas en la lista a continuación.
Bibliotecas
La mayoría de las bibliotecas bien escritas son en gran medida portátiles, solo asegúrese de que sean compatibles con:
Las buenas bibliotecas implican:
Los otros que necesita revisar … y eso lleva tiempo.
No creo que haya una respuesta perfecta allí. Pero como la portabilidad perfecta no es posible, debe decidir qué comstackdores y plataforma desea admitir.
Para la plataforma, debe comenzar con Windows y un sabor Linux. Para los comstackdores, elija dos (con Comeau si puede pagarlo).
Algunas pautas:
A veces hay que sacrificar eficiencia y rendimiento para ganar portabilidad. Por ejemplo, si su código requiere acceder a los campos desde un búfer, siempre puede lanzar una estructura empaquetada al puntero del búfer. Pero eso es terriblemente no portátil. Por lo tanto, en su lugar, necesita utilizar punteros con nombre calculados con compensaciones, a veces con código de manejo de alineación de límites. No es bonito, pero es portátil. Afortunadamente, puedes ocultar muchas de esas cosas con un uso juicioso de las interfaces de clase.
No todo el código debe escribirse de esa manera. Si diseña su aplicación de una manera muy modular con límites de responsabilidad bien definidos, entonces el 90-95% del código puede ser portátil sin dolor. Luego, solo aísle el 5-10% en un área muy localizada que debería personalizarse para una nueva plataforma.
Otros lo dijeron antes, pero aquí está mi opinión al respecto:
1) ¿Necesitas C ++? No es el mejor lenguaje para escribir código portátil porque está cerca del metal desnudo. Java, Python, Perl, PHP o Javascript pueden ser mejores para ti.
2) Si necesita C ++, no intente escribir código completamente portátil, de todos modos es casi imposible. En su lugar, decida primero qué plataformas desea admitir. Por ejemplo: Linux, MacOS X, Windows
3) Asegúrese de probar su código en todas las plataformas seleccionadas continuamente. No solo cree en Windows y espere simplemente comstackr una versión de Linux ‘cuando esté listo’. Comstack todas las plataformas a diario y asegúrate de seguir analizándolas en busca de problemas.
Para aprender, trate de evitar libros que se concentren en una implementación. En algunos casos, la introducción o un capítulo temprano le darán algunas instrucciones sobre cómo obtener o usar una implementación de idioma; si menciona más de una implementación, probablemente estés bien.
Obtenga un libro de referencia que sea independiente de la plataforma. El lenguaje de progtwigción C ++ de Stroustrup es una buena referencia, aunque no es un buen libro para que un principiante intente aprender de él. No confíe en referencias para una implementación dada. MSDN es útil, por ejemplo, pero su enfoque principal es cómo escribir progtwigs de Windows usando Visual C ++, no cómo escribir progtwigs que se comstackrán y ejecutarán en cualquier lugar.
Para escribir algo realmente útil, tendrá que entrar en un código no portátil. Trate de adquirir el hábito de separar el código de la interfaz de usuario de todo lo demás, ya que es donde tendrá la menor compatibilidad. Cuanto menos código tenga que cambiar entre plataformas, más portátil será su código.
Si puede, compile todo su código con al menos dos comstackdores diferentes.
El código independiente del sistema operativo es sorprendentemente difícil de hacer en C ++. Considera este ejemplo trivial:
#include int main(int argc, char** argv) { std::cout << argv[0] << std::endl; }
Eso es C ++ perfectamente válido, aún no es portable porque no aceptará argumentos de línea de comandos Unicode en Windows. La versión correcta para Windows sería:
#include int wmain(int argc, wchar_t** argv) { std::wcout << argv[0] << std::endl; }
Por supuesto, eso no es portable, funciona solo en Windows y no es estándar. De hecho, ni siquiera puede escribir una función main()
portable main()
en C ++ sin recurrir a la comstackción condicional.
una buena idea es usar las llamadas al sistema POSIX. De esta forma, no tendrá que lidiar con diferentes formas de crear subprocesos o usar mutexes y señales.
el problema es que Windows no es exactamente compatible con POSIX, pero hay bibliotecas que implementan ciertas características de POSIX, como esta: [1]: http://sourceware.org/pthreads-win32/