Domanda

Per supportare più piattaforme in C / C ++, si dovrebbe usare il preprocessore per abilitare le compilazioni condizionali. Per es.,

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

Come puoi farlo in Ada? Ada ha un preprocessore?

È stato utile?

Soluzione

La risposta alla tua domanda è no, Ada non ha un pre-processore integrato nella lingua. Ciò significa che ogni compilatore può averne o meno uno e non esiste "uniforme". sintassi per la pre-elaborazione e cose come la compilazione condizionale. Questo era intenzionale: è considerato "dannoso" all'etica di Ada.

Ci sono quasi sempre modi per aggirare la mancanza di un preprocessore, ma spesso la soluzione può essere un po 'ingombrante. Ad esempio, puoi dichiarare le funzioni specifiche della piattaforma come 'separate' e quindi usare gli strumenti di compilazione per compilare quello corretto (o un sistema di progetto, usando la sostituzione del corpo di pragma o un sistema di directory molto semplice ... metti tutti i file di Windows in / windows / e tutti i file linux in / linux / e include la directory appropriata per la piattaforma).

Detto questo, GNAT ha capito che a volte hai bisogno di un preprocessore e ha creato gnatprep. Dovrebbe funzionare indipendentemente dal compilatore (ma dovrai inserirlo nel tuo processo di compilazione). Allo stesso modo, per cose semplici (come la compilazione condizionale) probabilmente puoi semplicemente usare il pre-processore c o persino lanciarne uno tuo molto semplice.

Altri suggerimenti

AdaCore fornisce il preprocessore gnatprep , specializzato per Ada. Dichiarano che gnatprep "non dipende da nessuna caratteristica GNAT speciale", quindi sembra che dovrebbe funzionare con compilatori Ada non GNAT. La loro Guida per l'utente fornisce anche alcune compilazioni condizionali consigli .

Sono stato su un progetto in cui è stato usato anche m4, con le specifiche Ada e i file body con il suffisso "quot .m4s" e " .m4b " ;, rispettivamente.

La mia preferenza è davvero quella di evitare del tutto la preelaborazione e di utilizzare semplicemente organismi specializzati, impostare CM e il processo di creazione per gestirli.

No, ma il preprocessore CPP o m4 può essere chiamato su qualsiasi file sulla riga di comando o usando uno strumento di costruzione come make o ant. Suggerisco di chiamare il tuo file .ada per qualcos'altro. L'ho fatto per qualche tempo su file java. Chiamo il file java .m4 e utilizzo una regola di creazione per creare il file .java e quindi crearlo nel modo normale.

Spero che sia d'aiuto.

Alcuni vecchi compilatori dell'era Ada1983 hanno un pacchetto chiamato a.app che utilizzava un sottoinsieme # -prefisso di Ada (interpretato in fase di compilazione) come linguaggio di preelaborazione per generare Ada (da tradurre in codice macchina al momento della compilazione- tempo). Il Verdix Ada Development System (VADS) di Rational sembra essere il progenitore di a.app tra diversi compilatori di Ada. Sun Microsystems, ad esempio, ha derivato Ada SPARCompiler da VADS e quindi aveva anche a.app. Questo non è diverso dall'uso di PL / I come preprocessore di PL / I, come ha fatto IBM.

Il capitolo 2 è una documentazione dell'aspetto di a.app: http://dlc.sun.com/pdf/802-3641/802-3641.pdf

Sì.

Se stai usando il compilatore GNAT, puoi usare gnatprep per fare la preelaborazione, oppure se usi GNAT Programming Studio puoi configurare il tuo file di progetto per definire alcuni switch di compilazione condizionale come

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

In questo caso puoi usare gnatmake o gprbuild in modo da non dover eseguire manualmente gnatprep .

È molto utile, ad esempio, quando è necessario compilare lo stesso codice per diversi sistemi operativi utilizzando anche cross-compilatori diversi.

No, non lo è.

Se ne vuoi davvero uno, ci sono modi per ottenerne uno (Usa C, usa uno autonomo, ecc.) Tuttavia, direi di no. È stata una decisione di progettazione intenzionale non averne una. L'intera idea di un preprocessore è molto non-Ada.

La maggior parte di ciò per cui viene utilizzato il preprocessore di C può essere realizzato in Ada in altri modi più affidabili. L'unica eccezione importante è apportare modifiche minori a un file di origine per il supporto multipiattaforma. Dato quanto questo viene abusato in un tipico programma C multipiattaforma, sono ancora felice che non ci sia supporto in Ada. Pochissimi sviluppatori C / C ++ possono controllarsi abbastanza da mantenere le modifiche "minori". Il risultato può funzionare, ma spesso è quasi impossibile da leggere per un essere umano.

Il tipico modo di Ada per raggiungere questo obiettivo sarebbe quello di mettere il codice diverso in file diversi e utilizzare il sistema di compilazione per scegliere in qualche modo tra di loro al momento della compilazione. Make è abbastanza potente da aiutarti a farlo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top