Parece haber mucha confusión con respecto al preprocesador.
Lo que hace el compilador cuando ve #include
que reemplaza esa línea con el contenido de los archivos incluidos, sin hacer preguntas.
Entonces, si tiene un archivo a.h
con este contenido:
typedef int my_number;
y un archivo b.c
con este contenido:
#include "a.h"
#include "a.h"
el archivo b.c
será traducido por el preprocesador antes de la compilación a
typedef int my_number;
typedef int my_number;
que se traducirá en un error de compilación, ya que el tipo my_number
se define dos veces. Aunque la definición es la misma, el lenguaje C no lo permite.
Dado que un encabezado a menudo se usa en más de un lugar, los guardias de inclusión generalmente se usan en C.
#ifndef _a_h_included_
#define _a_h_included_
typedef int my_number;
#endif
El archivo b.c
aún tendría todo el contenido del encabezado en él dos veces después de haber sido preprocesado. Pero la segunda instancia sería ignorada ya que la macro _a_h_included_
ya habría sido definida.
Esto funciona muy bien, pero tiene dos inconvenientes. En primer lugar, los guardias de inclusión deben escribirse, y el nombre de la macro debe ser diferente en cada encabezado. Y en segundo lugar, el compilador todavía tiene que buscar el archivo de encabezado y leerlo con tanta frecuencia como está incluido.
Objective-C tiene la #import
instrucción de preprocesador (también se puede usar para código C y C ++ con algunos compiladores y opciones). Esto hace casi lo mismo que #include
, pero también observa internamente qué archivo ya se ha incluido. La #import
línea solo se reemplaza por el contenido del archivo con nombre por primera vez. Cada vez después de eso simplemente se ignora.