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ą:
typedef int my_number;
i plik b.c
z tą zawartością:
#include "a.h"
#include "a.h"
plik b.c
zostanie przetłumaczony przez preprocesora przed kompilacją
typedef int my_number;
typedef int my_number;
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:
#ifndef _a_h_included_
#define _a_h_included_
typedef int my_number;
#endif
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.