La directiva #import se agregó a Objective-C como una versión mejorada de #include. Sin embargo, si se mejora o no, aún es un tema de debate. #import asegura que un archivo solo se incluya una vez para que nunca tenga problemas con las inclusiones recursivas. Sin embargo, la mayoría de los archivos de encabezado decentes se protegen contra esto de todos modos, por lo que no es realmente un gran beneficio.
Básicamente, depende de usted decidir cuál quiere usar. Tiendo a # importar encabezados para cosas de Objective-C (como definiciones de clase y tal) e # incluir cosas estándar de C que necesito. Por ejemplo, uno de mis archivos fuente podría verse así:
#import <Foundation/Foundation.h>
#include <asl.h>
#include <mach/mach.h>
#ifndef myheader #define myheader
... seguido del código del encabezado ...#endif
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:y un archivo
b.c
con este contenido:el archivo
b.c
será traducido por el preprocesador antes de la compilación aque 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.
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.fuente
#include
sa#import
s en un archivo de encabezado de plantilla de línea 7000, hay una mejora notable en el rendimiento de la compilación y la capacidad de respuesta intellisense de XCode. (No creo que lo esté imaginando)Estoy de acuerdo con Jason
Me pillaron haciendo esto:
Para GNU gcc, seguía quejándose de que la función time () no estaba definida.
Entonces cambié #importar a #include y todo salió bien.
Razón:
# Importa <sys / time.h>:
<sys / time.h> incluye solo una parte de <time.h> utilizando #defines
# Importas <time.h>:
No te vayas. Aunque solo una parte de <time.h> ya estaba incluida, en
lo que respecta a #import, ese archivo ya está completamente incluido.
Línea de fondo:
Los encabezados C / C ++ tradicionalmente incluyen partes de otros archivos de inclusión.
Entonces, para los encabezados C / C ++, use #include.
Para los encabezados objc / objc ++, use #import.
fuente
#include
funciona igual que el C#include
.#import
realiza un seguimiento de qué encabezados ya se han incluido y se ignora si un encabezado se importa más de una vez en una unidad de compilación. Esto hace innecesario el uso de protectores de encabezado.La conclusión es solo usar
#import
en Objective-C y no te preocupes si tus encabezados terminan importando algo más de una vez.fuente
Sé que este hilo es antiguo ... pero en los "tiempos modernos" ... hay una "estrategia de inclusión" muy superior a través de los
@import
módulos de clang, que a menudo se pasa por alto ...o
Para habilitar los módulos, pase el indicador de línea de comandos
-fmodules
también conocidoCLANG_ENABLE_MODULES
comoXcode
- en el momento de la compilación. Como se mencionó anteriormente ... esta estrategia obvia CUALQUIERA y TODOLDFLAGS
. Como en, puede ELIMINAR cualquier configuración de "OTHER_LDFLAGS", así como también cualquier fase de "Vinculación".Encuentro que los tiempos de compilación / lanzamiento se "sienten" mucho más ágiles (o posiblemente, ¿hay un retraso menor durante la "vinculación"?) Y, además, brinda una gran oportunidad para purgar el archivo Project-Prefix.pch, ahora extraño, y configuración de generación correspondiente
GCC_INCREASE_PRECOMPILED_HEADER_SHARING
,GCC_PRECOMPILE_PREFIX_HEADER
yGCC_PREFIX_HEADER
, etc.Además, aunque no está bien documentado ... Puede crear correos
module.map
electrónicos para sus propios marcos e incluirlos de la misma manera conveniente. Puede echar un vistazo a mi repositorio github de ObjC-Clang-Modules para ver algunos ejemplos de cómo implementar tales milagros.fuente
Si está familiarizado con C ++ y macros, entonces
es parecido a
lo que significa que su clase se cargará solo una vez cuando se ejecute su aplicación.
fuente
#pragma once
se coloca en el archivo incluido, no en el archivo que realiza la inclusión. -1 por eso.En muchos casos, tenía una variable global en uno de mis
.h
archivos que causaba el problema, y la resolví agregandoextern
frente a ella.fuente
SI #incluye un archivo dos veces en archivos .h, el compilador dará un error. Pero si #importa un archivo más de una vez, el compilador lo ignorará.
fuente
#include
el mismo archivo dos veces no produce un error.#include
es simplemente un mecanismo de copiar y pegar. Hay un uso deliberado de#include
más de una vez sin incluir guardias, por ejemplo, la "macro X".#include
implementar un tipo de plantillas. Hicieron a#define
, incluyeron un encabezado,#undef
d y rehicieron el#define
, incluyeron el mismo encabezado por segunda vez. Esto dio como resultado que el código fuera parametrizado, válido e incluido dos veces, ya que el valor de la definición era diferente. Por lo tanto, el uso tiene ventajas#include
, pero si usa un lenguaje moderno como C ++ u ObjC, generalmente no necesita esto.#include
solía llevar "cosas" de otro archivo al que#include
se usa. Ej:en el archivo: main.cpp
El protector de encabezado se usa en la parte superior de cada archivo de encabezado (* .h) para evitar incluir el mismo archivo más de una vez (si sucede, obtendrá errores de compilación).
en el archivo: otherfile.h
incluso si coloca
#include
"otherfile.h" n tiempo en su código, este no se volverá a declarar.fuente
#include guard
Wiki : la protección de macros, la protección de encabezado o la protección de archivos evita que se incluya un encabezado doblepreprocessor
que puede ralentizar el tiempo de compilaciónEl siguiente paso es
.pch
[Acerca de] =>@import
[Acerca de][# importación en
.h
o.m
]fuente