2011-04-20 10 views
21

C (o un lenguaje basado en C), se puede usar sin problemas esta declaración:¿Qué hace #include en realidad? En

#include "hello.h"; 

y listo, todas las funciones y variables en hello.h es automágicamente utilizable.

Pero, ¿qué es lo que realmente hace? Miré a través de los documentos y tutoriales del compilador y dediqué un tiempo a buscar en línea, pero la única impresión que pude formar sobre el comando mágico #include es que "copia pega" el contenido de hello.h en lugar de esa línea. Tiene que haber más que eso.

+2

Si te sirve de consuelo, el preprocesador también puede insertar anotaciones específicas de la implementación para que si se genera información de depuración cuando se genera, obtiene los números de línea correctos. Si, literalmente, tuviera el efecto de copiar y pegar, el depurador no sabría el archivo fuente "real" y el número de línea. Además, '__FILE__' y' __LINE__' deben sustituirse como antes de copiar y pegar. Sin embargo, en lo que se refiere al significado del programa, copiar y pegar lo es. –

Respuesta

21

Lógicamente, copiar y pegar es exactamente lo que sucede. Me temo que ya no hay más. No necesita el ;, sin embargo.

Su ejemplo específico está cubierto por la especificación, la sección 6.10.2 Fuente archivo de inclusión, párrafo 3:

Una directiva de preprocesamiento de la forma

# include"q-char -secuencia"nueva línea

provoca la sustitución de esa directiva por todo el contenido del archivo de origen identificado por la secuencia especificada entre los delimitadores ".

5

Eso (copiar/pegar) es exactamente lo que #include "header.h" hace.

Tenga en cuenta que será diferente para #include <header.h> o cuando el compilador no puede encontrar el archivo "header.h" e intenta #include <header.h> en su lugar.

+1

"Diferente" solo porque generalmente busca en lugares diferentes y se asocia mentalmente con encabezados de biblioteca (estándar). – delnan

+0

@delnan, no tienen que ser diferentes en absoluto; todas las búsquedas se realizan de una manera "definida por la implementación", de acuerdo con la especificación. La diferencia es que la forma '" "' vuelve a la forma '<>' si no funciona. @pmg es totalmente correcto. –

+0

También "diferente" porque no es necesario que haya un archivo llamado '" thing.h "' cuando lo haga '#include '. – pmg

0

No realmente, no. El compilador guarda el descriptor original del archivo en una pila y abre el archivo #include d; cuando llega al final de ese archivo, lo cierra y vuelve al descriptor original del archivo. De esta forma, puede anidar #include d archivos de forma casi arbitraria.

+1

el pase del compilador en gcc, por ejemplo, no sabe nada sobre #include, porque es un pase de preprocesador. – fazo

+0

@fazo: en la mayoría de los casos, la distinción no tiene sentido. Si necesita pedantería por alguna razón, puedo ir a buscar una lista incompleta de compiladores y si usan preprocesadores o no. – geekosaur

0

Los "# include" declaración "llama la atención" de la pre -procesador (el proceso que ocurre antes de que su programa sea realmente compilado) y "le dice" al pre-procesador que incluya lo que sigue a la declaración "# include". Mientras que al preprocesador se le puede decir que haga bastante, en este caso se le pide que reconozca un archivo de encabezado (que se denota con una ".h" siguiendo el nombre de ese encabezado, lo que indica que es un encabezado). Ahora, un encabezado es un archivo que contiene declaraciones de C y definiciones de funciones no definidas explícitamente en su código. ¿Qué significa esto?Bueno, si quieres usar una función o definir un tipo especial de variable, y sabes que estas funciones/definición están definidas en otra parte (por ejemplo, la biblioteca estándar), puedes incluir (# incluir) el encabezado que sabes que contiene Que necesitas. De lo contrario, cada vez que desee utilizar una función de impresión (como en su caso), tendrá que volver a crear la función de impresión. Si no está definido explícitamente en su código y no #incluye el archivo de encabezado con la función que está utilizando, su compilador se quejará diciendo algo así como "¡Oye! No veo dónde se define esta función, así que no '¡No sé qué con esta función indefinida en tu código! ".

Cuestiones relacionadas