2012-08-25 5 views
6

Ich kann nichts auf MSDN oder anderswo finden, aber gibt es hart codierte Grenzen, wie tiefe Verschachtelung von Header-Aufnahme gehen kann? Beispiel:Gibt es Grenzen dafür, wie tief die Verschachtelung von Header-Including sein kann?

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

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

//... 

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

Ich frage mich, ob es irgendetwas im Standard darüber gibt. Wenn die Antwort implementiert ist, interessiert mich hauptsächlich die Visual Studio Toolchain.

+3

Es ist einfach herauszufinden. Lassen Sie einfach eine Datei selbst enthalten und sehen Sie, wenn es einen Fehler gibt. Sie können '# warning' verwenden, um eine Kopfzeile dazu zu zwingen, etwas auszudrucken, wenn die Fehlermeldung keine Tiefe hat. Clang stoppt zum Beispiel bei 200. –

Antwort

6

Die Norm sagt auch etwas darüber aus (im Teil über Umsetzungsmengen, Anhang B):

Die Grenzwerte können die Mengen einschränken, die die unten beschriebenen oder andere enthalten. Die Klammerzahl nach jeder Menge wird als Minimum für diese Menge empfohlen . Diese Mengen sind jedoch nur Richtlinien und bestimmen nicht die Einhaltung.

...

  • Klammerebenen für # include-Dateien [256].

Beachten Sie, dass dies nur ein Minimum empfohlen, so dass ein Compiler, dass viele Einschlüsse nicht unterstützen können (aber die meisten Compiler tun, wie in anderen Antworten gezeigt).

+0

+1 für das Standardangebot und akzeptiert. Das ist, was ich gesucht habe. – TemplateRex

3

Von MSDN for Visual Studio 2012:

Verschachtelung von Include-Dateien in 10 Stufen weiter kann.

UPDATE: ohne Grund

Diese „offizielle“ Grenze ist wohl eher eine Richtlinie so, dass die Menschen Include-Dateien nicht zu stapeln beginnt. Ich glaube nicht, dass es zumindest für ein paar Jahrzehnte einen Compiler mit so restriktiven Einschlusslimits gab.

Zum Beispiel, nach einer der anderen Antworten unterstützt mindestens eine Version des VS C++ Compilers etwa 1024 Verschachtelungsebenen.

+2

VS C++ Compiler saugt im Vergleich zu anderen Compilern –

+1

@ Mr.Anubis: Ich vermute, dass diese "offizielle" Grenze eigentlich eher eine Richtlinie ist, so dass die Leute nicht anfangen werden, Include-Dateien ohne Grund zu stapeln.Das tatsächliche Limit ist wahrscheinlich viel höher - obwohl das nicht macht der VS C++ Compiler nicht weniger saugen ... – thkala

+0

"Ich vermute, dass diese" offizielle "Grenze ist eigentlich eher eine Richtlinie, so dass die Leute nicht beginnen zu stapeln gehören Dateien ohne Grund "Ich weiß nicht, warum Leute das ohne vernünftigen Grund in ihren Projekten tun würden –

4

Ja: 200. Zumindest für meine Version von gcc.

Es kann leicht getestet werden:

#!/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 

Dies ergibt:

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

ich eine Header-Datei geschrieben, die selbst enthält und mit MSVS 2010 zusammengestellt, die die Fehlermeldung gab:

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

jeez !! MS MSDN ist nicht einmal aktualisiert, siehe @ Thkala Antwort –

+0

+1 Danke. Ich dachte nicht an Selbsteinschluss, um Grenzen zu testen. – TemplateRex