2012-08-25 6 views
6

nie mogę znaleźć nic na MSDN lub gdzie indziej, ale są tam zakodowane granice jak głębokie zagnieżdżanie włączenia nagłówka może udać? Przykład:Czy ogranicza się, jak głęboko gniazdowania włączenia nagłówka może udać?

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

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

//... 

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

Zastanawiam się, czy w tym standardzie jest coś o tym. Jeśli odpowiedź jest zdefiniowana jako implementacja, interesuje mnie przede wszystkim toolchain Visual Studio.

+3

Jest to łatwe do rozszyfrowania. Wystarczy, że sam plik się zawiera i zobacz, kiedy wystąpią błędy. Możesz użyć '# warning', aby wymusić na nagłówku wydrukowanie czegoś, jeśli komunikat o błędzie nie ma głębi. Klang zatrzymuje się na przykład na 200. –

Odpowiedz

6

norma mówi też coś na ten temat (w części o ilości realizacji, załącznik B):

Ograniczenia mogą ograniczać ilości obejmujące te opisane poniżej lub inne. Numer w nawiasie po każdej ilości zaleca jako minimum dla tej ilości. Jednak te ilości są tylko wytycznymi i nie określają zgodności.

...

  • poziomy zagnieżdżenia dla plików #include [256].

Należy pamiętać, że jest to tylko zalecana minimalna, więc kompilator nie może wspierać że wiele inkluzji (ale większość kompilatorów zrobić, jak pokazano w innych odpowiedzi).

+0

+1 dla standardowej oferty i zaakceptowane. Tego właśnie szukałem. – TemplateRex

3

Od MSDN for Visual Studio 2012:

Kaskadowanie zawierać pliki można kontynuować aż do 10 poziomów.

UPDATE:

Ten „oficjalny” granica jest prawdopodobnie bardziej wytycznej tak, że ludzie nie zaczną układać zawierać pliki bez powodu. Nie wierzę, że istnieje kompilator z tak restrykcyjnymi ograniczeniami włączenia przez przynajmniej kilka dekad.

Na przykład, zgodnie z jednym z innych odpowiedzi na co najmniej jednej wersji VS C++ obsługuje około 1024 poziomy zagnieżdżenia.

+2

Kompilator C++ kompilatora VS jest do dupy w porównaniu do innych kompilatorów –

+1

@ Mr.Anubis: Podejrzewam, że ten "oficjalny" limit jest w rzeczywistości bardziej wytyczną, aby ludzie nie zaczęli się układać w stosy bez żadnego powodu.Rzeczywisty limit jest prawdopodobnie o wiele wyższy - chociaż nie komplikuje to kompilatora VS C++ ... – thkala

+0

"Podejrzewam, że ten" oficjalny "limit jest w rzeczywistości bardziej wytyczną, aby ludzie nie zaczęli się stosować pliki bez powodu "Nie wiem, dlaczego ludzie robiliby to w swoich projektach bez uzasadnionego powodu. –

4

Tak: 200. Przynajmniej dla mojej wersji gcc.

To może być łatwo testowane:

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

Daje:

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

pisałem plik nagłówka, który zawiera się i skompilowane go z MSVS 2010 roku, który dał się komunikat o błędzie:

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

jeez !! MSDN MSDN nie jest nawet aktualizowany, zobacz odpowiedź @ thkala –

+0

+1 Dzięki. Nie myślałem o samo-włączeniu się do limitów testów. – TemplateRex

Powiązane problemy