Die Direktive #import wurde zu Objective-C als verbesserte Version von #include hinzugefügt. Ob es jedoch verbessert wird oder nicht, ist immer noch umstritten. #import stellt sicher, dass eine Datei immer nur einmal enthalten ist, sodass Sie nie ein Problem mit rekursiven Includes haben. Die meisten anständigen Header-Dateien schützen sich jedoch trotzdem davor, so dass dies nicht wirklich ein großer Vorteil ist.
Grundsätzlich liegt es an Ihnen, zu entscheiden, welche Sie verwenden möchten. Ich neige dazu, # Header für Objective-C-Dinge (wie Klassendefinitionen und dergleichen) zu importieren und # Standard-C-Sachen einzuschließen, die ich brauche. Zum Beispiel könnte eine meiner Quelldateien so aussehen:
#import <Foundation/Foundation.h>
#include <asl.h>
#include <mach/mach.h>
#ifndef myheader #define myheader
... gefolgt von Header-Code ...#endif
Es scheint viel Verwirrung hinsichtlich des Präprozessors zu geben.
Was der Compiler tut, wenn er sieht,
#include
dass er diese Zeile durch den Inhalt der enthaltenen Dateien ersetzt, ohne dass Fragen gestellt werden.Wenn Sie also eine Datei
a.h
mit diesem Inhalt haben:und eine Datei
b.c
mit diesem Inhalt:Die Datei
b.c
wird vom Präprozessor vor dem Kompilieren nach übersetztDies führt zu einem Compilerfehler, da der Typ
my_number
zweimal definiert wird. Obwohl die Definition dieselbe ist, ist dies in der C-Sprache nicht zulässig.Da ein Header häufig an mehr als einer Stelle verwendet wird, werden in C normalerweise Include-Schutzvorrichtungen verwendet. Dies sieht folgendermaßen aus:
Die Datei
b.c
würde nach der Vorverarbeitung noch zweimal den gesamten Inhalt des Headers enthalten. Die zweite Instanz würde jedoch ignoriert, da das Makro_a_h_included_
bereits definiert worden wäre.Das funktioniert sehr gut, hat aber zwei Nachteile. Zunächst müssen die Include-Guards geschrieben werden, und der Makroname muss in jedem Header unterschiedlich sein. Und zweitens muss der Compiler noch nach der Header-Datei suchen und sie so oft lesen, wie sie enthalten ist.
Objective-C verfügt über die
#import
Präprozessoranweisung (sie kann mit einigen Compilern und Optionen auch für C- und C ++ - Code verwendet werden). Dies macht fast das Gleiche wie#include
, merkt aber auch intern an, welche Datei bereits enthalten ist. Die#import
Zeile wird erst beim ersten Auftreten durch den Inhalt der benannten Datei ersetzt. Jedes Mal danach wird es einfach ignoriert.quelle
#include
s in#import
s in einer 7000-Zeilenvorlagen-Headerdatei wird eine deutliche Leistungsverbesserung bei der Kompilierung und der Reaktionsfähigkeit von XCode Intellisense festgestellt. (Ich glaube nicht, dass ich es mir vorstelle)Ich stimme Jason zu.
Ich wurde dabei erwischt:
Für GNU gcc wurde immer wieder beanstandet, dass die Funktion time () nicht definiert wurde.
Also habe ich #import in #include geändert und alles ging in Ordnung.
Grund:
Sie #importieren <sys / time.h>:
<sys / time.h> enthält nur einen Teil von <time.h>, indem Sie #defines verwenden
Sie #importieren <time.h>:
Nein. Obwohl nur ein Teil von <time.h> bereits enthalten war,
ist diese Datei für #import bereits vollständig enthalten.
Endeffekt:
C / C ++ - Header enthalten traditionell Teile anderer Include-Dateien.
Verwenden Sie für C / C ++ - Header #include.
Verwenden Sie für objc / objc ++ - Header #import.
quelle
#include
funktioniert genauso wie das C#include
.#import
Verfolgt, welche Header bereits enthalten sind, und wird ignoriert, wenn ein Header mehrmals in eine Kompilierungseinheit importiert wird. Dies macht es unnötig, Header Guards zu verwenden.Das Endergebnis wird nur
#import
in Objective-C verwendet und Sie müssen sich keine Sorgen machen, wenn Ihre Header mehr als einmal importieren.quelle
Ich weiß, dass dieser Thread alt ist ... aber in "modernen Zeiten" ... gibt es eine weit überlegene "Include-Strategie" über Clangs
@import
Module - das wird oft übersehen ...oder
Übergeben Sie zum Aktivieren von Modulen das Befehlszeilenflag
-fmodules
akaCLANG_ENABLE_MODULES
inXcode
- zur Kompilierungszeit. Wie oben erwähnt, vermeidet diese Strategie JEDES und ALLESLDFLAGS
. Wie in können Sie alle "OTHER_LDFLAGS" -Einstellungen sowie alle "Linking" -Phasen ENTFERNEN.Ich finde Kompilierungs- / Startzeiten, um mich viel schneller zu "fühlen" (oder möglicherweise gibt es beim "Verknüpfen" nur eine geringere Verzögerung?). Außerdem bietet es eine großartige Möglichkeit, die jetzt überflüssige Project-Prefix.pch-Datei zu löschen, und entsprechende Build - Einstellungen
GCC_INCREASE_PRECOMPILED_HEADER_SHARING
,GCC_PRECOMPILE_PREFIX_HEADER
undGCC_PREFIX_HEADER
etc.Auch wenn dies nicht gut dokumentiert ist… Sie können
module.map
s für Ihre eigenen Frameworks erstellen und diese auf dieselbe bequeme Weise einbinden. In meinem Github-Repo für ObjC-Clang-Module finden Sie einige Beispiele für die Umsetzung solcher Wunder.quelle
Wenn Sie mit C ++ und Makros vertraut sind, dann
ist ähnlich wie
Dies bedeutet, dass Ihre Klasse nur einmal geladen wird, wenn Ihre App ausgeführt wird.
quelle
#pragma once
wird in die eingeschlossene Datei eingefügt, nicht in die Datei, die das Einschließen ausführt. -1 dafür.In einem Fall hatte ich möglicherweise eine globale Variable in einer meiner
.h
Dateien, die das Problem verursachte, und ich löste sie, indem ich sieextern
davor hinzufügte .quelle
Wenn Sie eine Datei zweimal in .h-Dateien einschließen, gibt der Compiler einen Fehler aus. Wenn Sie eine Datei jedoch mehrmals importieren, wird sie vom Compiler ignoriert.
quelle
#include
Die gleiche Datei führt zweimal nicht zu einem Fehler.#include
ist einfach ein Mechanismus zum Kopieren und Einfügen. Es wird absichtlich#include
mehr als einmal ohne Include-Schutz verwendet, z. B. das "X-Makro".#include
dem eine Art Vorlagen implementiert wurden. Sie haben a gemacht#define
, einen Header#undef
eingefügt , d und den#define
, ein zweites Mal den gleichen Header eingefügt . Dies führte dazu, dass der Code zweimal parametrisiert, gültig und eingeschlossen wurde, da der Wert der Definition unterschiedlich war. Die Verwendung#include
bietet also Vorteile , aber wenn Sie eine moderne Sprache wie C ++ oder ObjC verwenden, benötigen Sie diese im Allgemeinen nicht.#include
Früher wurden "Dinge" aus einer anderen Datei in die Datei übertragen, in der sie#include
verwendet werden. Beispiel:in Datei: main.cpp
Der Header Guard wird oben in jeder Header-Datei (* .h) verwendet, um zu verhindern, dass dieselbe Datei mehrmals eingefügt wird (in diesem Fall werden Kompilierungsfehler angezeigt).
in Datei: otherfile.h
Selbst wenn Sie
#include
"otherfile.h" n-mal in Ihren Code einfügen, wird dieser darin nicht erneut deklariert.quelle
#include guard
Wiki - Makro-Schutz, Header-Schutz oder Datei-Schutz verhindert, dass ein Header durch einen doppelt eingeschlossen wirdpreprocessor
, was die Erstellungszeit verlangsamen kannDer nächste Schritt ist
.pch
[Über] =>@import
[Über][#import in
.h
oder.m
]quelle