Tampaknya ada banyak kebingungan mengenai preprosesor.
Apa yang dikompilasi oleh kompiler ketika ia melihat #includebahwa ia menggantikan baris itu dengan isi dari file yang disertakan, tidak ada pertanyaan yang diajukan.
Jadi jika Anda memiliki file a.hdengan konten ini:
typedef int my_number;
dan file b.cdengan konten ini:
#include "a.h"
#include "a.h"
file b.cakan diterjemahkan oleh preprocessor sebelum dikompilasi ke
typedef int my_number;
typedef int my_number;
yang akan menghasilkan kesalahan kompiler, karena jenisnya my_numberdidefinisikan 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.cmasih 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 #importinstruksi 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 #importgaris hanya digantikan oleh isi dari nama file untuk pertama kalinya ditemui. Setiap saat setelah itu hanya diabaikan.