Esistono usi pratici per consentire l'inclusione ricorsiva di un file?

2

Attualmente sto implementando il preprocessore simile a NASM per il mio assemblatore e mi chiedo quale sia il modo corretto di gestire i file inclusi ricorsivamente. Da quello che vedo, ci sono due modi per affrontarlo senza appendere il preprocessore o il sistema operativo:

  1. Imposta la massima profondità di inclusione.
  2. Non consentire l'inclusione di un file in modo ricorsivo (da non confondere con l'esclusione di un file due volte ).

Inoltre, per quanto posso vedere, il secondo approccio fa essenzialmente lo stesso lavoro, ma produce messaggi di errore più belli. Confronta l'output di Clang, quando si compila il file contenente solo #include "main.cpp" :

In file included from main.cpp:1:
[ repeated many times ]
In file included from main.cpp:1:
main.cpp:1:10: error: #include nested too deeply
#include "main.cpp"

con questo (il modo attuale di gestirlo nel preprocessore, l'input è simile a quello precedente, fa %include "1.mov.asm" alla riga 6):

In file /home/griwes/projects/reaverasm/tests/1.mov.asm in line 6:
Error: file '/home/griwes/projects/reaverasm/tests/1.mov.asm' included recursively.

L'approccio che impedisce l'inclusione ricorsiva produce - IMHO - output più leggibile.

La domanda è: esiste una tecnica del preprocessore che verrebbe eliminata impedendo l'inclusione ricorsiva? Questa domanda è indipendente dalla lingua, quindi sentiti libero di fornire esempi da qualsiasi lingua.

    
posta Griwes 09.03.2013 - 18:08
fonte

2 risposte

2

La libreria Boost.Preprocessor estende e abusa del C / Preprocessore C ++ in modi strani e meravigliosi. Una delle sue funzioni è iterazione di file , che ti consente di # includi un file più volte con diverse macro # define'd ogni volta, e notano che può essere utile (ed è supportato) per un file per iterare su se stesso. (Cerca gli esempi qui per BOOST_PP_IS_ITERATING .) Questo è un esempio di ricorsione (limitata).

    
risposta data 08.05.2013 - 20:19
fonte
0

Penso che tu stia combinando due cose diverse:

  1. Indica se consentire l'inclusione ricorsiva
  2. L'output dell'errore

Ho visto più esempi del mondo reale in cui si desiderava l'inclusione ricorsiva, ma di solito si trattava di aggirare le limitazioni nel preprocessore. Sento che è sbagliato non consentire alcuna ricorsione, ma un limite di 10 volte è ragionevole IMO.

    
risposta data 09.03.2013 - 18:15
fonte

Leggi altre domande sui tag