Pregunta

Para soportar múltiples plataformas en C / C ++, uno usaría el preprocesador para habilitar compilaciones condicionales. Por ejemplo,

#ifdef _WIN32
  #include <windows.h>
#endif

¿Cómo puedes hacer esto en Ada? ¿Ada tiene un preprocesador?

¿Fue útil?

Solución

La respuesta a su pregunta es no, Ada no tiene un preprocesador integrado en el idioma. Eso significa que cada compilador puede tener o no tener uno y no hay "uniforme". sintaxis para preprocesamiento y cosas como compilación condicional. Esto fue intencional: se considera "dañino" al ethos de Ada.

Casi siempre hay formas de evitar la falta de un preprocesador, pero a menudo la solución puede ser un poco engorrosa. Por ejemplo, puede declarar las funciones específicas de la plataforma como 'separadas' y luego usar las herramientas de compilación para compilar la correcta (ya sea un sistema de proyecto, utilizando el reemplazo del cuerpo de pragma o un sistema de directorio muy simple ... coloque todos los archivos de Windows en / windows / y todos los archivos de linux en / linux / e incluyen el directorio apropiado para la plataforma).

Dicho todo esto, GNAT se dio cuenta de que a veces necesita un preprocesador y ha creado gnatprep. Debería funcionar independientemente del compilador (pero deberá insertarlo en su proceso de compilación). Del mismo modo, para cosas simples (como la compilación condicional), probablemente pueda usar el preprocesador c o incluso rodar el suyo muy simple.

Otros consejos

AdaCore proporciona el gnatprep preprocesador, que está especializado para Ada Afirman que gnatprep '' no depende de ninguna característica especial de GNAT '', por lo que parece que debería funcionar con compiladores Ada no GNAT. Su Guía del usuario también proporciona una compilación condicional advice .

He estado en un proyecto donde también se usó m4, con las especificaciones de Ada y los archivos del cuerpo con el sufijo '' .m4s '' y ".m4b", respectivamente.

Mi preferencia es realmente evitar el preprocesamiento por completo, y solo usar cuerpos especializados, configurar CM y el proceso de construcción para administrarlos.

No, pero se puede llamar al preprocesador CPP o m4 en cualquier archivo en la línea de comando o usando una herramienta de construcción como make o ant. Sugiero llamar a su archivo .ada de otra manera. He hecho esto por algún tiempo en archivos java. Llamo al archivo java .m4 y uso una regla de creación para crear el .java y luego construirlo de la manera normal.

Espero que eso ayude.

Algunos compiladores antiguos de la era Ada1983 tienen un paquete llamado a.app que utiliza un subconjunto # de Ada (interpretado en tiempo de compilación) como un lenguaje de preprocesamiento para generar Ada (que luego se traducirá al código de la máquina en la compilación) hora). El sistema de desarrollo Verdix Ada de Rational (VADS) parece ser el progenitor de a.app entre varios compiladores Ada. Sun Microsystems, por ejemplo, deriva el Ada SPARCompiler de VADS y, por lo tanto, también tiene un.app. Esto no es diferente al uso de PL / I como preprocesador de PL / I, que hizo IBM.

El Capítulo 2 es una documentación de cómo se ve a.app: http://dlc.sun.com/pdf/802-3641/802-3641.pdf

Sí, lo ha hecho.

Si está utilizando el compilador GNAT, puede usar gnatprep para realizar el preprocesamiento, o si usa GNAT Programming Studio puede configurar su archivo de proyecto para definir algunos modificadores de compilación condicionales como

#if SOMESWITCH then
-- Your code here is executed only if the switch SOMESWITCH is active in your build configuration
#end if;

En este caso, puede usar gnatmake o gprbuild para no tener que ejecutar gnatprep a mano.

Eso es muy útil, por ejemplo, cuando necesita compilar el mismo código para varios sistemas operativos diferentes utilizando incluso diferentes compiladores cruzados.

No, no lo hace.

Si realmente quiere uno, hay maneras de obtener uno (use C, use uno independiente, etc.) Sin embargo, argumentaría en contra de eso. Fue una decisión de diseño intencional no tener uno. Toda la idea de un preprocesador es muy poco adaptada.

La mayoría del uso del preprocesador de C se puede lograr en Ada de otras maneras más confiables. La única excepción importante es realizar cambios menores en un archivo fuente para el soporte multiplataforma. Dado cuánto se abusa de esto en un programa C multiplataforma típico, todavía estoy feliz de que no haya soporte en Ada. Muy pocos desarrolladores de C / C ++ pueden controlarse lo suficiente como para mantener los cambios "menores". El resultado puede funcionar, pero a menudo es casi imposible de leer para un humano.

La forma típica de Ada de lograr esto sería colocar el código diferente en archivos diferentes y usar su sistema de compilación para elegir de alguna manera entre ellos en el momento de la compilación. Make es lo suficientemente poderoso como para ayudarte a hacer esto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top