2012-08-25 27 views
6

No puedo encontrar nada en MSDN ni en ningún otro lugar, pero ¿hay límites rígidos a la profundidad de anidamiento de la inclusión del encabezado? Ejemplo:¿Existen límites respecto a qué tan profundo puede anidar la inclusión de encabezado?

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

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

//... 

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

Me pregunto si hay algo en el estándar sobre esto. Si la respuesta es la implementación definida, entonces estoy interesado principalmente en la cadena de herramientas de Visual Studio.

+3

Es fácil de entender. Solo tiene que incluir un archivo y ver cuándo se produce un error. Puede usar '# warning' para forzar un encabezado para imprimir algo, si el mensaje de error no tiene profundidad. Clang se detiene en 200, por ejemplo. –

Respuesta

6

La norma también dice algo al respecto (en la parte sobre cantidades de implementación, anexo B):

Los límites pueden limitar las cantidades que incluyen las que se describen a continuación u otros. El número entre corchetes después de cada cantidad se recomienda como el mínimo para esa cantidad. Sin embargo, estas cantidades son solo directrices y no determinan el cumplimiento.

...

  • niveles de anidación de archivos # include [256].

Tenga en cuenta que esto es sólo una mínima recomendada, por lo que un compilador puede no admitir esa cantidad de inclusiones (pero la mayoría de los compiladores de hacer, como se muestra en otras respuestas).

+0

+1 para la cotización estándar y aceptado. Esto es lo que estaba buscando. – TemplateRex

3

De MSDN for Visual Studio 2012:

anidamiento de archivos de inclusión pueden continuar hasta 10 niveles.

ACTUALIZACIÓN:

Este límite "oficial" es probablemente más de una directriz para que las personas no van a empezar a apilar archivos de inclusión para ninguna razón. No creo que haya habido un compilador con límites de inclusión tan restrictivos durante al menos un par de décadas.

Por ejemplo, según una de las otras respuestas, al menos una versión del compilador VS C++ admite unos 1024 niveles de anidación.

+2

El compilador de C++ de VS es una mierda en comparación con otros compiladores –

+1

@ Mr.Anubis: Sospecho que este límite "oficial" es en realidad más una pauta para que las personas no comiencen a apilar archivos sin ninguna razón.El límite real es probablemente mucho más alto, aunque eso no hace que el compilador de VS C++ aspire menos ... – thkala

+0

"Sospecho que este límite" oficial "es en realidad más una pauta para que las personas no comiencen a apilar archivos sin ninguna razón "No sé por qué los pueblos harían eso en sus proyectos sin ninguna razón razonable –

4

Sí: 200. Al menos para mi versión de gcc.

Puede ser fácilmente probados:

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

Esto 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

escribí un archivo de cabecera que incluye en sí y se compila con MSVS 2010. Eso dio el mensaje de error:

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

jeez !! MSDN de MS no está actualizado, ver la respuesta de @ thkala –

+0

+1 Gracias. No pensé en la auto inclusión para poner a prueba los límites. – TemplateRex

Cuestiones relacionadas