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:
typedef int my_number;
dan file b.c
dengan konten ini:
#include "a.h"
#include "a.h"
file b.c
akan diterjemahkan oleh preprocessor sebelum dikompilasi ke
typedef int my_number;
typedef int my_number;
yang 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:
#ifndef _a_h_included_
#define _a_h_included_
typedef int my_number;
#endif
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.