La directive #import a été ajoutée à Objective-C en tant que version améliorée de #include. L'amélioration ou non, cependant, fait toujours débat. #import garantit qu'un fichier n'est inclus qu'une seule fois afin que vous n'ayez jamais de problème avec les inclusions récursives. Cependant, la plupart des fichiers d'en-tête décents se protègent de toute façon contre cela, ce n'est donc pas vraiment un avantage.
Fondamentalement, c'est à vous de décider lequel vous souhaitez utiliser. J'ai tendance à #importer les en-têtes pour les choses Objective-C (comme les définitions de classe et autres) et #inclure les éléments C standard dont j'ai besoin. Par exemple, l'un de mes fichiers source pourrait ressembler à ceci:
#import <Foundation/Foundation.h>
#include <asl.h>
#include <mach/mach.h>
#ifndef myheader #define myheader
... suivi du code d'en-tête ...#endif
Il semble y avoir beaucoup de confusion concernant le préprocesseur.
Ce que fait le compilateur lorsqu'il voit
#include
qu'il remplace cette ligne par le contenu des fichiers inclus, aucune question n'est posée.Donc, si vous avez un fichier
a.h
avec ce contenu:et un fichier
b.c
avec ce contenu:le fichier
b.c
sera traduit par le préprocesseur avant la compilation ence qui entraînera une erreur de compilation, car le type
my_number
est défini deux fois. Même si la définition est la même, cela n'est pas autorisé par le langage C.Comme un en-tête est souvent utilisé à plusieurs endroits, les gardes sont généralement utilisés en C. Cela ressemble à ceci:
Le fichier
b.c
contiendrait toujours l'intégralité du contenu de l'en-tête deux fois après avoir été prétraité. Mais la deuxième instance serait ignorée car la macro_a_h_included_
aurait déjà été définie.Cela fonctionne vraiment bien, mais présente deux inconvénients. Tout d'abord, les gardes d'inclusion doivent être écrits et le nom de la macro doit être différent dans chaque en-tête. Et deuxièmement, le compilateur doit toujours chercher le fichier d'en-tête et le lire aussi souvent qu'il est inclus.
Objective-C possède l'
#import
instruction de préprocesseur (elle peut également être utilisée pour le code C et C ++ avec certains compilateurs et options). Cela fait presque la même chose#include
, mais il note également en interne quel fichier a déjà été inclus. La#import
ligne est uniquement remplacée par le contenu du fichier nommé pour la première fois qu'il est rencontré. Chaque fois après cela, il est simplement ignoré.la source
#include
s en#import
s sur un fichier d'en-tête de modèle de ligne 7000, il y a une amélioration notable des performances dans la compilation et la réactivité XCode intellisense. (Je ne pense pas que je l'imagine)Je suis d'accord avec Jason.
Je me suis fait prendre en faisant ça:
Pour GNU gcc, il se plaignait que la fonction time () n'était pas définie.
Alors j'ai changé #import en #include et tout s'est bien passé.
Raison:
Vous #importez <sys / time.h>:
<sys / time.h> inclut uniquement une partie de <time.h> en utilisant #defines
Vous #importez <time.h>:
Non, allez. Même si seulement une partie de <time.h> était déjà incluse, en
ce qui concerne #import, ce fichier est maintenant déjà complètement inclus.
Conclusion:
Les en-têtes C / C ++ incluent traditionnellement des parties d'autres fichiers include.
Donc, pour les en-têtes C / C ++, utilisez #include.
Pour les en-têtes objc / objc ++, utilisez #import.
la source
#include
fonctionne comme le C#include
.#import
conserve la trace des en-têtes déjà inclus et est ignoré si un en-tête est importé plusieurs fois dans une unité de compilation. Cela rend inutile l'utilisation de protecteurs d'en-tête.Le résultat est simplement utilisé
#import
dans Objective-C et ne vous inquiétez pas si vos en-têtes finissent par importer quelque chose plus d'une fois.la source
Je sais que ce fil est vieux ... mais dans "les temps modernes" .. il y a une "stratégie d'inclusion" bien supérieure via les
@import
modules de clang - qui est souvent négligée ..ou
Pour activer les modules, passez l'indicateur de ligne de commande
-fmodules
akaCLANG_ENABLE_MODULES
inXcode
- au moment de la compilation. Comme mentionné ci-dessus .. cette stratégie évite TOUT et TOUSLDFLAGS
. Comme dans, vous pouvez SUPPRIMER tous les paramètres "OTHER_LDFLAGS", ainsi que toutes les phases de "liaison".Je trouve que les temps de compilation / lancement se "sentent" beaucoup plus rapides (ou peut-être, il y a juste un peu moins de retard lors de la "liaison"?) .. et fournit également une excellente occasion de purger le fichier Project-Prefix.pch désormais superflu, et paramètres de construction correspondants,
GCC_INCREASE_PRECOMPILED_HEADER_SHARING
,GCC_PRECOMPILE_PREFIX_HEADER
etGCC_PREFIX_HEADER
, etc.De plus, bien que cela ne soit pas bien documenté… Vous pouvez créer des
module.map
s pour vos propres frameworks et les inclure de la même manière pratique. Vous pouvez jeter un oeil à mon repo github ObjC-Clang-Modules pour quelques exemples de mise en œuvre de tels miracles.la source
Si vous connaissez C ++ et les macros, alors
est similaire à
ce qui signifie que votre classe ne sera chargée qu'une seule fois lors de l'exécution de votre application.
la source
#pragma once
est placé dans le fichier inclus, pas le fichier qui effectue l'inclusion. -1 pour ça.Dans le cas où j'ai eu une variable globale dans l'un de mes
.h
fichiers qui causait le problème, et je l'ai résolu en l'ajoutantextern
devant.la source
SI vous #incluez un fichier deux fois dans des fichiers .h, le compilateur donnera une erreur. Mais si vous # importez un fichier plus d'une fois, le compilateur l'ignorera.
la source
#include
le même fichier deux fois n'entraîne pas d'erreur.#include
est simplement un mécanisme de copier-coller. Il y a une utilisation délibérée de#include
plusieurs fois sans inclure de gardes, par exemple la "macro X".#include
implémentait une sorte de modèles. Ils ont fait un#define
, inclus un en-tête,#undef
d et refait le#define
, inclus le même en-tête une deuxième fois. Cela a abouti à ce que le code soit paramétré, valide et inclus deux fois, car la valeur de la définition était différente. Il y a donc des avantages à utiliser#include
, mais si vous utilisez un langage moderne comme C ++ ou ObjC, vous n'avez généralement pas besoin de cela.#include
il sert à obtenir des "choses" d'un autre fichier à celui#include
dans lequel il est utilisé. Ex:dans le fichier: main.cpp
Le protège-en-tête est utilisé en haut de chaque fichier d'en-tête (* .h) pour éviter d'inclure le même fichier plus d'une fois (si cela se produit, vous obtiendrez des erreurs de compilation).
dans le fichier: otherfile.h
même si vous mettez
#include
"otherfile.h" n time dans votre code, celui-ci ne sera pas redéclaré.la source
#include guard
Wiki - macro guard, header guard ou file guard empêche de doubler un en-tête par unpreprocessor
qui peut ralentir un temps de constructionLa prochaine étape est
.pch
[À propos] =>@import
[À propos][#import dans
.h
ou.m
]la source