Sembra esserci molta confusione riguardo al preprocessore.
Cosa fa il compilatore quando vede #include
che sostituisce quella linea con il contenuto dei file inclusi, senza fare domande.
Quindi se hai un file a.h
con questo contenuto:
typedef int my_number;
e un file b.c
con questo contenuto:
#include "a.h"
#include "a.h"
il file b.c
verrà tradotto dal preprocessore prima della compilazione in
typedef int my_number;
typedef int my_number;
che comporterà un errore del compilatore, poiché il tipo my_number
viene definito due volte. Anche se la definizione è la stessa, ciò non è consentito dal linguaggio C.
Poiché un'intestazione viene spesso utilizzata in più di un posto , in genere le protezioni vengono utilizzate in C. Questo è simile al seguente:
#ifndef _a_h_included_
#define _a_h_included_
typedef int my_number;
#endif
Il file b.c
avrebbe comunque l'intero contenuto dell'intestazione due volte dopo essere stato preelaborato. Ma la seconda istanza verrebbe ignorata poiché la macro _a_h_included_
sarebbe già stata definita.
Funziona davvero bene, ma ha due inconvenienti. Prima di tutto devono essere scritte le protezioni di inclusione e il nome della macro deve essere diverso in ogni intestazione. In secondo luogo, il compilatore deve ancora cercare il file di intestazione e leggerlo tutte le volte che è incluso.
Objective-C ha l' #import
istruzione preprocessore (può anche essere usato per codice C e C ++ con alcuni compilatori e opzioni). Questo fa quasi lo stesso #include
, ma nota anche internamente quale file è già stato incluso. La #import
riga viene sostituita solo dal contenuto del file indicato per la prima volta che viene rilevata. Ogni volta dopo viene semplicemente ignorato.