Dyrektywa #import została dodana do Objective-C jako ulepszona wersja #include. Jednak kwestia, czy jest poprawiona, jest nadal kwestią dyskusyjną. #import zapewnia, że plik jest dołączany tylko raz, więc nigdy nie będziesz mieć problemu z rekurencyjnymi włączeniami. Jednak większość porządnych plików nagłówkowych i tak się przed tym chroni, więc nie jest to tak bardzo korzystne.
Zasadniczo to Ty decydujesz, którego chcesz użyć. Staram się #importować nagłówki do rzeczy w Objective-C (takich jak definicje klas i tym podobne) i #include standardowych rzeczy C, których potrzebuję. Na przykład jeden z moich plików źródłowych może wyglądać następująco:
#import <Foundation/Foundation.h>
#include <asl.h>
#include <mach/mach.h>
#ifndef myheader #define myheader
... a następnie kod nagłówka ...#endif
Wydaje się, że istnieje wiele nieporozumień dotyczących preprocesora.
Co robi kompilator, gdy zobaczy
#include
, że zastępuje ten wiersz zawartością dołączonych plików, bez zadawania pytań.Więc jeśli masz plik
a.h
z tą zawartością:i plik
b.c
z tą zawartością:plik
b.c
zostanie przetłumaczony przez preprocesora przed kompilacjąco spowoduje błąd kompilatora, ponieważ typ
my_number
jest zdefiniowany dwukrotnie. Mimo że definicja jest taka sama, język C nie zezwala na to.Ponieważ nagłówek jest często używany w więcej niż jednym miejscu, w C. zwykle stosowane są osłony. Wygląda to tak:
Plik
b.c
nadal zawierałby całą zawartość nagłówka dwukrotnie po przetworzeniu. Ale druga instancja zostałaby zignorowana, ponieważ makro_a_h_included_
zostałoby już zdefiniowane.Działa to naprawdę dobrze, ale ma dwie wady. Przede wszystkim należy napisać strażników dołączania, a nazwa makra musi być inna w każdym nagłówku. Po drugie, kompilator wciąż musi szukać pliku nagłówka i czytać go tak często, jak jest dołączony.
Objective-C ma
#import
instrukcję preprocesora (może być również używana do kodu C i C ++ z niektórymi kompilatorami i opcjami). Robi to prawie tak samo jak#include
, ale wewnętrznie zauważa, który plik został już dołączony.#import
Linia otrzymuje jedynie przez zawartość pliku o nazwie po raz pierwszy go spotkałem. Za każdym razem jest to po prostu ignorowane.źródło
#include
s#import
na plik nagłówka szablonu linii 7000 zauważalna jest poprawa wydajności kompilacji i responsywności inteligencji XCode. (Nie sądzę, że to sobie wyobrażam)Zgadzam się z Jasonem.
Zostałem przyłapany na robieniu tego:
W przypadku GNU gcc ciągle narzekał, że funkcja time () nie została zdefiniowana.
Więc zmieniłem #import na #include i wszystko poszło dobrze.
Powód:
#Import <sys / time.h>:
<sys / time.h> obejmuje tylko część <time.h> przy użyciu #defines
Ty #import <time.h>:
Nie idź. Mimo że tylko część <time.h> została już uwzględniona, jeśli
chodzi o #import, plik ten jest już całkowicie uwzględniony.
Dolna linia:
Nagłówki C / C ++ tradycyjnie zawierają części innych plików dołączanych.
Dlatego w przypadku nagłówków C / C ++ użyj #include.
W przypadku nagłówków objc / objc ++ użyj #import.
źródło
#include
działa podobnie jak C#include
.#import
śledzi, które nagłówki zostały już uwzględnione i jest ignorowany, jeśli nagłówek jest importowany więcej niż raz w jednostce kompilacyjnej. To sprawia, że nie trzeba używać osłon nagłówka.Najważniejsze jest użycie
#import
w Objective-C i nie martw się, jeśli twoje nagłówki skończą importować coś więcej niż raz.źródło
Wiem, że ten wątek jest stary ... ale w „czasach współczesnych” .. istnieje moduły clanga
@import
o wiele lepsze niż „strategia” - to często pomijane…lub
Aby włączyć moduły, przekaż flagę wiersza polecenia
-fmodules
akaCLANG_ENABLE_MODULES
inXcode
- w czasie kompilacji. Jak wspomniano powyżej ... ta strategia eliminuje WSZYSTKIE i WSZYSTKIELDFLAGS
. W tej chwili możesz USUNĄĆ wszelkie ustawienia „OTHER_LDFLAGS”, a także wszelkie fazy „Łączenie”.Uważam, że czasy kompilacji / uruchamiania „czują się” znacznie szybsze (a może po prostu mniej opóźnień podczas „łączenia”?) .., a także, stanowią doskonałą okazję do wyczyszczenia obcego pliku Project-Prefix.pch, i odpowiadających ustawień budować
GCC_INCREASE_PRECOMPILED_HEADER_SHARING
,GCC_PRECOMPILE_PREFIX_HEADER
iGCC_PREFIX_HEADER
itpPonadto, choć nie jest to dobrze udokumentowane… Możesz tworzyć
module.map
własne ramy dla własnych ram i włączać je w ten sam wygodny sposób. Możesz zapoznać się z moim repozytorium github z modułów ObjC-Clang-Modules, aby zobaczyć przykłady implementacji takich cudów.źródło
Jeśli znasz C ++ i makra, to
jest podobne do
co oznacza, że Twoja klasa zostanie załadowana tylko raz po uruchomieniu aplikacji.
źródło
#pragma once
jest umieszczony w dołączonym pliku, a nie w pliku, który wykonuje dołączenie. -1 za to.Być może miałem zmienną globalną w jednym z moich
.h
plików, która była przyczyną problemu, i rozwiązałem ją, dodającextern
przed nią.źródło
JEŚLI # dołączasz plik dwa razy do plików .h, niż kompilator da błąd. Ale jeśli #importujesz plik więcej niż raz, kompilator go zignoruje.
źródło
#include
ten sam plik dwukrotnie nie powoduje błędu.#include
to po prostu mechanizm kopiuj i wklej. Celowe użycie#include
więcej niż raz bez uwzględnienia strażników, np. „Makra X”.#include
do implementacji pewnego rodzaju szablonów. Zrobili a#define
, włączyli nagłówek,#undef
d i redidowali#define
, po raz drugi zawarli ten sam nagłówek. Spowodowało to, że kod został sparametryzowany, poprawny i uwzględniony dwukrotnie, ponieważ wartość definicji była inna. Są więc zalety używania#include
, ale jeśli używasz nowoczesnego języka, takiego jak C ++ lub ObjC, na ogół nie potrzebujesz tego.#include
kiedyś przenosił „rzeczy” z innego pliku do tego, w którym#include
jest używany. Np .:w pliku: main.cpp
Zabezpieczenie nagłówka jest używane na górze każdego pliku nagłówka (* .h), aby zapobiec dołączeniu tego samego pliku więcej niż jeden raz (jeśli tak się stanie, wystąpią błędy kompilacji).
w pliku: otherfile.h
nawet jeśli wpiszesz
#include
„otherfile.h” n w swoim kodzie, to w nim nie zostanie ponownie zapisane.źródło
#include guard
Wiki - ochrona makr, ochrona nagłówka lub ochrona plików zapobiega podwójnemu włączeniu nagłówka,preprocessor
co może spowolnić czas kompilacjiNastępnym krokiem jest
.pch
[Informacje] =>@import
[Informacje][#import w
.h
lub.m
]źródło