307 votos

¿Cuál es la diferencia entre #importar y #incluir en Objective-C?

¿Cuáles son las diferencias entre #importar y #incluir en Objective-C y hay momentos donde se debe utilizar uno sobre el otro? Es uno desuso?

Yo estaba leyendo el siguiente tutorial: http://www.otierney.net/objective-c.html#preamble y en su párrafo sobre #la importación y #include parece contradecirse a sí misma o, al menos, está claro.

278voto

Jason Coco Puntos 52303

La directiva #import fue añadido a Objective-C como una versión mejorada de #include. Si no ha mejorado, sin embargo, es todavía un tema de debate. #importar asegura que un archivo sólo se haya incluido una vez para que nunca tenga un problema con recursiva incluye. Sin embargo, la mayoría decente archivos de encabezado de protegerse contra esto, de todos modos, así que en realidad no es mucho de un beneficio.

Básicamente es hasta usted para decidir que desea utilizar. Tiendo a #importar encabezados por Objeto-C cosas (como las definiciones de clase y tal) y #include de C estándar cosas que necesito. Por ejemplo, uno de mis archivos de origen podría tener este aspecto:

#import <Foundation/Foundation.h>

#include <asl.h>
#include <mach/mach.h>

278voto

Sven Puntos 13090

No parece haber mucha confusión con respecto a la preprocesador.

Lo que el compilador hace cuando se ve a un #include que reemplaza esa línea con el contenido de los archivos incluidos, sin preguntas.

Así que si usted 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á traducida por el preprocesador antes de la compilación a

typedef int my_number;
typedef int my_number;

lo que resultará en un error de compilación, ya que el tipo my_number se definen dos veces. Aunque la definición es la misma que esto no está permitido por el lenguaje C.

Desde una cabecera a menudo se utiliza en más de un lugar incluir a los guardias por lo general se utilizan en C. esto se parece a Esto:

 #ifndef _a_h_included_
 #define _a_h_included_

 typedef int my_number;

 #endif

El archivo b.c todavía tendría todo el contenido de la cabecera en dos veces después de ser procesados. Pero la segunda instancia sería ignorado desde la macro _a_h_included_ ya han sido definidos.

Esto funciona realmente bien, pero tiene dos inconvenientes. La primera de todas la de incluir los guardias tienen que ser por escrito, y el nombre de la macro tiene que ser diferente en cada encabezado. Y en segundo lugar, el compilador aún tiene que buscar el archivo de encabezado y leer tan a menudo como es incluido.

Objective-C tiene la #import instrucción de preprocesador (también puede ser utilizado para código C y C++ con algunos compiladores y opciones). Esto hace casi el mismo #include, pero se observa también internamente el archivo que ya ha sido incluido. La #import de la línea sólo se sustituye por el contenido de el archivo con el nombre de la primera vez que se encontraron. Cada vez después de que ella es simplemente ignorado.

56voto

user512705 Puntos 441

Estoy de acuerdo con Jason.

Me metí a hacer este:

#import <sys/time.h>  // to use gettimeofday() function
#import <time.h>      // to use time() function

Para GNU gcc, quejándose de que la función time() se no definido.

Así que he cambiado de #import #include y todo fue ok.

Razón:

#Import <sys/time.h>:
<sys/time.h> incluye sólo una parte de <time.h> mediante el uso de #define


#Import <time.h>:
No ir. Aunque sólo una parte de <time.h> ya estaba incluido, como
ahora como #importación de que se trate, que el archivo ya está completamente incluido.


Línea inferior:

C/C++ encabezados tradicionalmente incluye partes de otros archivos de inclusión.
Así que para C/C++ encabezados, utilice #include.
Para objc/objc++ encabezados, utilice #importar.

20voto

Ferruccio Puntos 51508

#include funciona igual que el C #include.

#import hace un seguimiento de las cabeceras ya han sido incluidos y se ignora si el encabezado es importado más de una vez en una unidad de compilación. Esto hace que sea innecesario el uso del encabezado de los guardias.

La línea inferior es simplemente usar #import en Objective-C y no se preocupe si su encabezados de viento de hasta importando más de una vez.

4voto

Evol Gate Puntos 944

Si usted está familiarizado con C++ y macros y, a continuación,

#import "Class.h" 

es similar a

{
#pragma once

#include "class.h"
}

lo que significa que su Clase se carga una sola vez cuando la aplicación se ejecuta.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X