A diretiva #import foi adicionada ao Objective-C como uma versão aprimorada do #include. Se é ou não melhorado, no entanto, ainda é uma questão de debate. #import garante que um arquivo seja incluído apenas uma vez, para que você nunca tenha problemas com inclusões recursivas. No entanto, a maioria dos arquivos de cabeçalho decentes se protege contra isso de qualquer maneira, portanto, não é realmente um grande benefício.
Basicamente, cabe a você decidir qual você deseja usar. Costumo # importar cabeçalhos para coisas de Objective-C (como definições de classe e outras) e # incluir coisas padrão de C que eu preciso. Por exemplo, um dos meus arquivos de origem pode ficar assim:
#import <Foundation/Foundation.h>
#include <asl.h>
#include <mach/mach.h>
#ifndef myheader #define myheader
... seguido por código de cabeçalho ...#endif
Parece haver muita confusão em relação ao pré-processador.
O que o compilador faz quando vê
#include
que substitui essa linha pelo conteúdo dos arquivos incluídos, sem perguntas.Portanto, se você possui um arquivo
a.h
com este conteúdo:e um arquivo
b.c
com este conteúdo:o arquivo
b.c
será traduzido pelo pré-processador antes da compilação parao que resultará em um erro do compilador, pois o tipo
my_number
é definido duas vezes. Mesmo que a definição seja a mesma, isso não é permitido pela linguagem C.Como um cabeçalho geralmente é usado em mais de um local, os protetores geralmente são usados em C. Isso se parece com isso:
O arquivo
b.c
ainda teria todo o conteúdo do cabeçalho nele duas vezes depois de pré-processado. Mas a segunda instância seria ignorada, pois a macro_a_h_included_
já teria sido definida.Isso funciona muito bem, mas tem duas desvantagens. Antes de tudo, os protetores de inclusão precisam ser escritos e o nome da macro deve ser diferente em cada cabeçalho. Em segundo lugar, o compilador ainda precisa procurar o arquivo de cabeçalho e lê-lo com a frequência incluída.
O Objective-C possui a
#import
instrução de pré - processador (também pode ser usada para o código C e C ++ com alguns compiladores e opções). Isso faz quase o mesmo que#include
, mas também observa internamente qual arquivo já foi incluído. A#import
linha é substituída apenas pelo conteúdo do arquivo nomeado pela primeira vez. Toda vez depois disso é apenas ignorado.fonte
#include
s para#import
s em um arquivo de cabeçalho de modelo de linha 7000, há uma melhoria notável no desempenho na compilação e na capacidade de resposta do XCode intellisense. (Eu não acho que eu estou imaginando)Eu concordo com o Jason.
Eu fui pego fazendo isso:
Para o GNU gcc, ele continuava reclamando que a função time () não estava definida.
Então mudei #import para #include e tudo correu bem.
Razão:
Você #importa <sys / time.h>:
<sys / time.h> inclui apenas uma parte de <time.h> usando #defines
Você # importa <time.h>:
não é possível. Embora apenas parte de <time.h> já tenha sido incluída, no que
diz respeito a #import, esse arquivo já está completamente incluído.
Bottom line:
Tradicionalmente, os cabeçalhos C / C ++ incluem partes de outros arquivos de inclusão.
Portanto, para cabeçalhos C / C ++, use #include.
Para cabeçalhos objc / objc ++, use #import.
fonte
#include
funciona exatamente como o C#include
.#import
controla quais cabeçalhos já foram incluídos e será ignorado se um cabeçalho for importado mais de uma vez em uma unidade de compilação. Isso torna desnecessário o uso de proteções de cabeçalho.A linha inferior é apenas usar
#import
no Objective-C e não se preocupe se seus cabeçalhos acabarem importando algo mais de uma vez.fonte
Eu sei que esse tópico é antigo ... mas nos "tempos modernos" .. há uma estratégia de inclusão "muito superior" através dos
@import
módulos do clang - que é frequentemente ignorada.ou
Para habilitar os módulos, passe o sinalizador da linha de comando
-fmodules
akaCLANG_ENABLE_MODULES
inXcode
- em tempo de compilação. Como mencionado acima .. essa estratégia evita QUALQUER e TODOSLDFLAGS
. Assim, você pode REMOVER qualquer configuração "OTHER_LDFLAGS", bem como qualquer fase "Vincular".Acho que os tempos de compilação / inicialização "parecem" muito mais rápidos (ou possivelmente há menos atraso ao "vincular"?) ... e também oferecem uma ótima oportunidade para limpar o arquivo Project-Prefix.pch, agora estranho, e configurações de compilação correspondente
GCC_INCREASE_PRECOMPILED_HEADER_SHARING
,GCC_PRECOMPILE_PREFIX_HEADER
eGCC_PREFIX_HEADER
, etc.Além disso, embora não esteja bem documentado ... Você pode criar
module.map
s para suas próprias estruturas e incluí-las da mesma maneira conveniente. Você pode dar uma olhada no meu repositório github ObjC-Clang-Modules para ver alguns exemplos de como implementar esses milagres.fonte
Se você estiver familiarizado com C ++ e macros, então
é similar a
o que significa que sua classe será carregada apenas uma vez quando o aplicativo for executado.
fonte
#pragma once
é colocado no arquivo incluído, não no arquivo que executa a inclusão. -1 para isso.Em maio, eu tinha uma variável global em um dos meus
.h
arquivos que estava causando o problema e a resolvi adicionando-aextern
à frente.fonte
Se você # incluir um arquivo duas vezes em arquivos .h, o compilador dará erro. Mas se você # importar um arquivo mais de uma vez, o compilador o ignorará.
fonte
#include
o mesmo arquivo duas vezes não resulta em erro.#include
é simplesmente um mecanismo de copiar e colar. Há uso deliberado de#include
mais de uma vez sem incluir proteções, por exemplo, a "macro X".#include
implementar um tipo de modelos. Eles fizeram a#define
, incluíram um cabeçalho,#undef
refizeram o#define
, incluíram o mesmo cabeçalho uma segunda vez. Isso resultou no código sendo parametrizado, válido e incluído duas vezes, pois o valor da definição era diferente. Portanto, há vantagens em usar#include
, mas se você estiver usando uma linguagem moderna como C ++ ou ObjC, geralmente não precisará disso.#include
costumava obter "coisas" de outro arquivo para aquele em que#include
é usado. Ex:no arquivo: main.cpp
A proteção de cabeçalho é usada na parte superior de cada arquivo de cabeçalho (* .h) para impedir a inclusão do mesmo arquivo mais de uma vez (se isso acontecer, você receberá erros de compilação).
no arquivo: otherfile.h
mesmo se você colocar
#include
"otherfile.h" n tempo no seu código, isso dentro dele não será redeclarado.fonte
#include guard
Wiki - proteção de macro, proteção de cabeçalho ou proteção de arquivo impede a inclusão dupla de um cabeçalho por umpreprocessor
que pode diminuir o tempo de compilaçãoO próximo passo é
.pch
[Sobre] =>@import
[Sobre][#importar
.h
ou.m
]fonte