Question

Pour prendre en charge plusieurs plates-formes en C / C ++, on utiliserait le pré-processeur pour permettre les compilations conditionnelles. Par exemple,

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

Comment pouvez-vous faire cela à Ada? Ada a-t-il un préprocesseur?

Était-ce utile?

La solution

La réponse à votre question est non, Ada n’a pas de pré-processeur intégré au langage. Cela signifie que chaque compilateur peut ou non en avoir un et qu’il n’existe pas de "uniforme". syntaxe pour le pré-traitement et des choses comme la compilation conditionnelle. C'était intentionnel: c'est considéré comme "nuisible". à la philosophie Ada.

Il y a presque toujours des solutions au problème de l'absence de préprocesseur, mais souvent, la solution peut être un peu lourde. Par exemple, vous pouvez déclarer les fonctions spécifiques à la plate-forme «séparées», puis utiliser les outils de compilation pour compiler la bonne (système de projet, remplacement du corps de pragma ou système de répertoires très simple ... mettez tous les fichiers Windows dans / windows / et tous les fichiers linux dans / linux / et incluez le répertoire approprié pour la plate-forme).

Cela étant dit, GNAT s’est rendu compte que vous aviez parfois besoin d’un pré-processeur et avait créé gnatprep. Cela devrait fonctionner quel que soit le compilateur (mais vous devrez l'insérer dans votre processus de construction). De même, pour des choses simples (comme la compilation conditionnelle), vous pouvez probablement simplement utiliser le pré-processeur c ou même lancer votre propre processeur très simple.

Autres conseils

AdaCore fournit le gnatprep , qui est spécialisé dans Ada. Ils affirment que gnatprep "ne dépend d'aucune fonctionnalité GNAT spéciale", il semble donc que cela devrait fonctionner avec des compilateurs Ada non-GNAT. Leur Guide de l’utilisateur fournit également des conseils de compilation conditionnelle. / p>

J'ai participé à un projet dans lequel m4 était également utilisé, les fichiers de corps et de spécification Ada étant suffixés par ".m4s". et ".m4b", respectivement.

Ma préférence est vraiment d'éviter le prétraitement et d'utiliser simplement des organismes spécialisés, la configuration de CM et le processus de construction permettant de les gérer.

Non, mais le préprocesseur CPP ou m4 peuvent être appelés sur n’importe quel fichier de la ligne de commande ou à l’aide d’un outil de construction tel que make ou ant. Je suggère d'appeler votre fichier .ada quelque chose d'autre. Je l'ai fait pendant un certain temps sur les fichiers java. J'appelle le fichier java .m4 et utilise une règle de création pour créer le fichier .java, puis le construire normalement.

J'espère que cela aide.

Certains anciens compilateurs d’Ada1983 ont un paquet appelé a.app qui utilise un sous-ensemble préfabriqué # de Ada (interprété à la construction) comme langage de prétraitement pour générer Ada (à traduire ensuite en code machine à la compilation). temps). Le système de développement Verdix Ada (VADS) de Rational semble être le précurseur de a.app parmi plusieurs compilateurs Ada. Sun Microsystems, par exemple, a dérivé Ada SPARCompiler de VADS et avait donc également a.app. Ce n'est pas sans rappeler l'utilisation de PL / I en tant que pré-processeur de PL / I, comme l'a fait IBM.

Le chapitre 2 contient des informations sur le fonctionnement de a.app: http://dlc.sun.com/pdf/802-3641/802-3641.pdf

Oui, c'est le cas.

Si vous utilisez le compilateur GNAT, vous pouvez utiliser gnatprep pour effectuer le prétraitement ou, si vous utilisez GNAT Programming Studio, vous pouvez configurer votre fichier de projet pour définir des commutateurs de compilation conditionnelle tels que

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

Dans ce cas, vous pouvez utiliser gnatmake ou gprbuild pour ne pas avoir à exécuter gnatprep à la main.

C'est très utile, par exemple, lorsque vous devez compiler le même code pour plusieurs systèmes d'exploitation différents en utilisant même plusieurs compilateurs croisés.

Non, ce n'est pas le cas.

Si vous en voulez vraiment un, il y a moyen de vous en procurer un (utilisez les C, utilisez-en un seul, etc.). Cependant, je suis contre. C'était une décision de conception délibérée de ne pas en avoir. L’idée même d’un préprocesseur est très banale.

La plupart des utilisations du préprocesseur de C peuvent être réalisées dans Ada de manière plus fiable. La seule exception majeure concerne les modifications mineures apportées à un fichier source afin de prendre en charge plusieurs plates-formes. Etant donné à quel point cela est maltraité dans un programme C typique multiplate-forme, je suis toujours heureux que cela ne soit pas pris en charge par Ada. Très peu de développeurs C / C ++ peuvent se contrôler suffisamment pour conserver les modifications "mineures". Le résultat peut fonctionner, mais il est souvent presque impossible pour un humain de lire.

La manière typique pour Ada d’y parvenir serait de placer les différents codes dans différents fichiers et d’utiliser votre système de construction pour les choisir en quelque sorte au moment de la compilation. Make est suffisamment puissant pour vous aider.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top