Arahan #import ditambahkan ke Objective-C sebagai versi perbaikan dari #include. Namun apakah itu diperbaiki atau tidak, masih menjadi bahan perdebatan. #import memastikan bahwa file hanya pernah dimasukkan sekali sehingga Anda tidak pernah memiliki masalah dengan menyertakan rekursif. Namun, sebagian besar file header yang layak melindungi diri terhadap hal ini, jadi itu tidak terlalu banyak manfaatnya.
Pada dasarnya, terserah Anda untuk memutuskan mana yang ingin Anda gunakan. Saya cenderung #memindahkan header untuk hal-hal Objective-C (seperti definisi kelas dan semacamnya) dan #mengikutkan hal-hal standar C yang saya butuhkan. Sebagai contoh, salah satu file sumber saya mungkin terlihat seperti ini:
#import <Foundation/Foundation.h>
#include <asl.h>
#include <mach/mach.h>
#ifndef myheader #define myheader
... diikuti oleh kode tajuk ...#endif
Tampaknya ada banyak kebingungan mengenai preprosesor.
Apa yang dikompilasi oleh kompiler ketika ia melihat
#include
bahwa ia menggantikan baris itu dengan isi dari file yang disertakan, tidak ada pertanyaan yang diajukan.Jadi jika Anda memiliki file
a.h
dengan konten ini:dan file
b.c
dengan konten ini:file
b.c
akan diterjemahkan oleh preprocessor sebelum dikompilasi keyang akan menghasilkan kesalahan kompiler, karena jenisnya
my_number
didefinisikan dua kali. Meskipun definisinya sama, ini tidak diizinkan oleh bahasa C.Karena header sering digunakan di lebih dari satu tempat termasuk penjaga biasanya digunakan dalam C. Ini terlihat seperti ini:
File
b.c
masih akan memiliki seluruh isi header di dalamnya dua kali setelah diproses. Tetapi instance kedua akan diabaikan karena makro_a_h_included_
sudah ditentukan.Ini bekerja dengan sangat baik, tetapi memiliki dua kelemahan. Pertama-tama penjaga menyertakan harus ditulis, dan nama makro harus berbeda di setiap header. Dan kedua kompiler masih harus mencari file header dan membacanya sesering yang disertakan.
Objective-C memiliki
#import
instruksi preprocessor (juga dapat digunakan untuk kode C dan C ++ dengan beberapa kompiler dan opsi). Ini hampir sama dengan#include
, tetapi juga mencatat secara internal file mana yang sudah dimasukkan. The#import
garis hanya digantikan oleh isi dari nama file untuk pertama kalinya ditemui. Setiap saat setelah itu hanya diabaikan.sumber
#include
s menjadi#import
pada file header template 7000 baris, ada peningkatan kinerja yang nyata dalam kompilasi dan responsif intellisense XCode. (Saya rasa saya tidak membayangkannya)Saya setuju dengan Jason.
Saya ketahuan melakukan ini:
Untuk GNU gcc, ia terus mengeluh bahwa fungsi time () tidak didefinisikan.
Jadi saya mengubah #import menjadi #include dan semuanya berjalan ok.
Alasan:
Anda #import <sys / time.h>:
<sys / time.h> hanya menyertakan sebagian dari <time.h> dengan menggunakan #defines
Anda #import <time.h>:
Jangan pergi. Meskipun hanya sebagian dari <time.h> yang sudah disertakan,
sejauh menyangkut #import, file itu sekarang sudah sepenuhnya disertakan.
Intinya:
C / C ++ header secara tradisional termasuk bagian dari file include lainnya.
Jadi untuk header C / C ++, gunakan #include.
Untuk header objc / objc ++, gunakan #import.
sumber
#include
bekerja seperti C#include
.#import
melacak tajuk mana yang sudah dimasukkan dan diabaikan jika tajuk diimpor lebih dari sekali dalam unit kompilasi. Ini membuatnya tidak perlu menggunakan pelindung tajuk.Intinya hanya digunakan
#import
di Objective-C dan jangan khawatir jika header Anda akhirnya mengimpor sesuatu lebih dari sekali.sumber
Saya tahu utas ini sudah lama ... tetapi di "zaman modern" .. ada jauh lebih unggul "termasuk strategi" melalui modul dentang
@import
- yang sering diabaikan ..atau
Untuk mengaktifkan modul, berikan flag baris perintah
-fmodules
aliasCLANG_ENABLE_MODULES
diXcode
- pada waktu kompilasi. Seperti disebutkan di atas .. strategi ini menyingkirkan APA PUN dan SEMUALDFLAGS
. Seperti di, Anda dapat MENGHAPUS pengaturan "OTHER_LDFLAGS" apa pun, serta setiap fase "Menautkan" ..Saya menemukan waktu kompilasi / peluncuran untuk "merasa" jauh lebih tajam (atau mungkin, hanya ada sedikit jeda saat "menautkan"?) .. dan juga, memberikan peluang besar untuk membersihkan file Project-Prefix.pch yang sekarang asing, dan sesuai pengaturan membangun,
GCC_INCREASE_PRECOMPILED_HEADER_SHARING
,GCC_PRECOMPILE_PREFIX_HEADER
, danGCC_PREFIX_HEADER
, dllSelain itu, walaupun tidak didokumentasikan dengan baik ... Anda dapat membuat
module.map
s untuk kerangka kerja Anda sendiri dan memasukkannya dengan cara yang nyaman. Anda dapat melihat repo github Modul ObjC-Dentang saya untuk beberapa contoh bagaimana menerapkan mukjizat tersebut.sumber
Jika Anda terbiasa dengan C ++ dan makro, maka
mirip dengan
yang berarti bahwa Kelas Anda akan dimuat hanya sekali ketika aplikasi Anda berjalan.
sumber
#pragma once
ditempatkan di file yang disertakan, bukan file yang melakukan menyertakan. -1 untuk itu.Mungkin saya memiliki variabel global di salah satu
.h
file saya yang menyebabkan masalah, dan saya menyelesaikannya dengan menambahkanextern
di depannya.sumber
JIKA Anda memasukkan file dua kali dalam file .h daripada compiler akan memberikan kesalahan. Tetapi jika Anda #memasukkan file lebih dari satu kali kompiler akan mengabaikannya.
sumber
#include
file yang sama dua kali tidak menghasilkan kesalahan.#include
hanyalah mekanisme salin dan tempel. Ada penggunaan yang disengaja#include
lebih dari sekali tanpa menyertakan penjaga, misalnya "X makro".#include
untuk mengimplementasikan semacam template. Mereka melakukan#define
, termasuk header,#undef
d dan redid the#define
, termasuk header yang sama untuk kedua kalinya. Ini mengakibatkan kode menjadi parameter, valid, dan dimasukkan dua kali, karena nilai dari definisinya berbeda. Jadi ada keuntungan menggunakan#include
, tetapi jika Anda menggunakan bahasa modern seperti C ++ atau ObjC, Anda biasanya tidak memerlukan ini.#include
itu digunakan untuk mendapatkan "hal-hal" dari file lain ke yang#include
digunakan. Ex:dalam file: main.cpp
Header guard digunakan di bagian atas setiap file header (* .h) untuk mencegah memasukkan file yang sama lebih dari satu kali (jika itu terjadi Anda akan mendapatkan kesalahan kompilasi).
dalam file: otherfile.h
bahkan jika Anda meletakkan
#include
"otherfile.h" n waktu dalam kode Anda, ini di dalamnya tidak akan dideklarasikan ulang.sumber
#include guard
Wiki - pelindung makro, pelindung tajuk atau pelindung file mencegah penggandaan tajuk dengan tandapreprocessor
yang dapat memperlambat waktu pembuatanLangkah selanjutnya adalah
.pch
[Tentang] =>@import
[Tentang][# impor dalam
.h
atau.m
]sumber