Frage

Um mehrere Plattformen in C/C++ zu unterstützen, würde man den Präprozessor verwenden, um bedingte Kompilierungen zu ermöglichen.Z.B.,

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

Wie kann man das in Ada machen?Hat Ada einen Präprozessor?

War es hilfreich?

Lösung

Die Antwort auf Ihre Frage ist nicht, Ada keine Pre-Prozessor haben, die in die Sprache integriert ist. Das bedeutet, dass jeder Compiler kann oder auch nicht haben, und es gibt keine „einheitliche“ Syntax für die Vorverarbeitung und Dinge wie die bedingte Kompilierung. Das war Absicht: es ist als „schädlich“ das Ada Ethos

.

Es gibt fast immer Möglichkeiten, um einen Mangel an einem Prä-Prozessor aber oft die Lösung ein wenig umständlich sein kann. Zum Beispiel können Sie die plattformspezifische Funktionen als ‚separate‘ deklarieren und dann Build-Tools verwenden, um die richtige (entweder ein Projektsystem zu kompilieren, Pragma Körperersatz oder ein sehr einfaches Verzeichnissystem mit ... setzen alle Windows-Dateien in / windows / und alle linux-Dateien in / linux / und schließen Sie das entsprechende Verzeichnis für die Plattform).

Alles wird gesagt, GNAT erkannte, dass manchmal braucht man einen Präprozessor und hat gnatprep erstellt. Es sollte funktionieren, unabhängig von den Compiler (aber Sie werden es in Ihren Build-Prozess einsetzen müssen). In ähnlicher Weise für einfache Dinge (wie die bedingte Kompilierung) können Sie wahrscheinlich nur den c verwenden Pre-Prozessor oder sogar Ihre eigenen sehr einfach rollen.

Andere Tipps

AdaCore bietet die gnatprep Präprozessor, die spezialisiert ist Ada. Sie erklären, dass gnatprep „hängt nicht von irgendwelchen speziellen GNAT Features“, so dass es klingt, als ob es mit nicht-GNAT Ada Compiler funktionieren soll. Deren Benutzerhandbuch enthält auch einige bedingte Kompilierung Beratung .

Ich habe an einem Projekt, in denen m4 auch, nachgestellt mit der Ada spec und Körper Dateien verwendet wurde, als „.m4s“ und „.m4b“ bezeichnet.

Meine Präferenz ist wirklich ganz zu vermeiden Vorverarbeitung und nur spezialisierte Stellen verwenden, CM Aufbau und den Build-Prozesses, sie zu verwalten.

Nein, aber die CPP Präprozessor oder m4 kann auf eine beliebige Datei auf der Kommandozeile oder mit einem Gebäude-Tool wie Marke oder Ameise genannt werden. Ich schlage vor, Ihre .ada Datei etwas anderes fordern. Ich habe dies auf Java-Dateien für einige Zeit getan. Ich nenne die Java-Datei .M4 und eine Make-Regel verwenden, um die .java zu erstellen und bauen sie dann in gewohnter Weise.

Ich hoffe, das hilft.

Einige alte Ada-Compiler aus der 1983er-Ära verfügen über ein Paket namens a.app, das eine Teilmenge von Ada mit dem Präfix # (zur Erstellungszeit interpretiert) als Vorverarbeitungssprache zum Generieren von Ada verwendet (um dann zur Kompilierungszeit in Maschinencode übersetzt zu werden).Das Verdix Ada Development System (VADS) von Rational scheint unter mehreren Ada-Compilern der Vorläufer einer.app zu sein.Sun Microsystems hat beispielsweise den Ada SPARCompiler von VADS abgeleitet und verfügte somit auch über eine.app.Dies ist der Verwendung von PL/I als Präprozessor von PL/I durch IBM nicht unähnlich.

Kapitel 2 enthält eine Dokumentation darüber, wie eine.app aussieht: http://dlc.sun.com/pdf/802-3641/802-3641.pdf

Ja, es hat.

Wenn Sie GNAT Compiler verwenden, können Sie gnatprep für das Erledigen der Vorverarbeitung verwenden, oder wenn Sie GNAT Programming Studio verwenden, können Sie Ihre Projektdatei konfigurieren einige bedingte Kompilierung Schalter wie

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

In diesem Fall können Sie gnatmake oder gprbuild verwenden, so dass Sie müssen nicht gnatprep von Hand ausgeführt werden.

Das ist sehr nützlich, zum Beispiel, wenn Sie den gleichen Code für mehrere unterschiedliche Betriebssysteme verwenden auch verschiedene Cross-Compiler kompilieren müssen.

Nein, es funktioniert nicht.

Wenn Sie wirklich haben wollen, gibt es Möglichkeiten, eine (Verwendung C ist, verwenden Sie ein Stand-alone-on etc.) zu bekommen Allerdings würde ich dagegen argumentieren. Es war ein zweckmäßiges Design Entscheidung nicht ein. Die ganze Idee eines Vorprozessors ist sehr un-Ada.

Die meisten von dem, was C Präprozessor für verwendet wird, in Ada in anderer zuverlässiger Weise erreicht werden kann. Die einzige große Ausnahme ist in geringfügige Änderungen an eine Quelldatei für plattformübergreifende Unterstützung. Bedenkt man, wie viel dies in einem typischen plattformübergreifende C-Programm missbraucht wird, bin ich immer noch glücklich gibt es keine Unterstützung für sie in Ada. Nur sehr wenige C / C ++ Entwickler können sich genug steuern, um die Änderungen „geringfügig“ zu halten. Das Ergebnis kann funktionieren, aber ist oft fast unmöglich für einen Menschen zu lesen.

Der typische Ada Weg dies zu tun, den anderen Code in verschiedenen Dateien zu setzen wäre und Ihr Build-System zu verwenden, um irgendwie zwischen ihnen bei der Kompilierung zu wählen. Machen Sie ist viel leistungsfähig genug, um Ihnen dies zu tun.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top