2012-08-25 9 views
6

Non riesco a trovare nulla su MSDN o altrove, ma ci sono dei limiti hard-coded su come può andare la nidificazione profonda dell'intestazione dell'intestazione? Esempio:Ci sono limiti a quanto può andare la nidificazione profonda dell'inclusione dell'intestazione?

// H1.h 
// guards etc. 
#include "H2.h" 

// H2.h 
// guards etc. 
#include "H3.h" 

//... 

// HN.h <---- how large can N get?? 

Mi chiedo se ci sia qualcosa nello Standard su questo. Se la risposta è definita dall'implementazione, sono principalmente interessato alla toolchain di Visual Studio.

+3

È facile da capire. Devi solo includere un file stesso e vedere quando si verificano errori. Puoi usare '# warning' per forzare un'intestazione per stampare qualcosa, se il messaggio di errore non ha una profondità. Clang si ferma a 200, per esempio. –

risposta

6

Lo standard dice anche qualcosa (nella parte relativa alle quantità di implementazione, allegato B):

I limiti possono limitare le quantità che includono quelle descritte di seguito o altro. Il numero tra parentesi che segue ogni quantità è raccomandato come come minimo per quella quantità. Tuttavia, queste quantità sono solo linee guida e non determinano la conformità.

...

  • Livelli di parentesi per i file # include [256].

noti che questa è solo una minima consigliata, quindi un compilatore non può supportare molte inclusioni (ma la maggior parte dei compilatori fare, come mostrato in altre risposte).

+0

+1 per la quotazione standard e accettato. Questo è quello che stavo cercando. – TemplateRex

3

Da MSDN for Visual Studio 2012:

annidamento di file include possono continuare fino a 10 livelli.

UPDATE:

Questo limite "ufficiale" è probabilmente più di una linea guida in modo che la gente non inizierà a impilare includere i file per nessun motivo. Non credo che ci sia stato un compilatore con limiti di inclusione così restrittivi almeno per un paio di decenni.

Ad esempio, in base ad una delle altre risposte, almeno una versione del compilatore VS C++ supporta circa 1024 livelli di nidificazione.

+2

Il compilatore C++ di VS fa schifo rispetto ad altri compilatori –

+1

@ Mr.Anubis: Sospetto che questo limite "ufficiale" sia in realtà più di una linea guida in modo che le persone non inizino a impilare i file inclusi senza motivo.Il limite effettivo è probabilmente molto più alto, anche se questo non rende il compilatore VS C++ più piccolo ... – thkala

+0

"Sospetto che questo limite" ufficiale "sia in realtà più di una linea guida in modo che le persone non inizino a impilare file senza motivo "Non so perché i popoli lo farebbero nei loro progetti senza ragione ragionevole –

4

Sì: 200. Almeno per la mia versione di gcc.

Esso può essere facilmente testato:

#!/bin/bash 

i=0 

touch "test$i.c" 

while gcc -c "test$i.c"; do 
    j="$[ $i + 1 ]" 
    echo "#include \"test$i.c\"" > "test$j.c" 
    i="$j" 
    echo "$j" | grep -q "000$" && echo "$j are fine" 
done 

Questo produce:

In file included from test2.c:1:0, 
      from test3.c:1, 
      from test4.c:1, 
      ... 
      from test198.c:1, 
      from test199.c:1, 
      from test200.c:1: 
test1.c:1:19: error: #include nested too deeply 
6

ho scritto un file di intestazione che si comprende e compilato con MSVS 2010. Che ha dato il messaggio di errore:

fatal error C1014: too many include files : depth = 1024 
+0

jeez !! MSDN di MS non è nemmeno aggiornato, vedi la risposta di @ thkala –

+0

+1 Grazie. Non pensavo all'autoinclusione per testare i limiti. – TemplateRex

Problemi correlati