Es scheint viel Verwirrung hinsichtlich des Präprozessors zu geben.
Was der Compiler tut, wenn er sieht, #include
dass er diese Zeile durch den Inhalt der enthaltenen Dateien ersetzt, ohne dass Fragen gestellt werden.
Wenn Sie also eine Datei a.h
mit diesem Inhalt haben:
typedef int my_number;
und eine Datei b.c
mit diesem Inhalt:
#include "a.h"
#include "a.h"
Die Datei b.c
wird vom Präprozessor vor dem Kompilieren nach übersetzt
typedef int my_number;
typedef int my_number;
Dies führt zu einem Compilerfehler, da der Typ my_number
zweimal definiert wird. Obwohl die Definition dieselbe ist, ist dies in der C-Sprache nicht zulässig.
Da ein Header häufig an mehr als einer Stelle verwendet wird, werden in C normalerweise Include-Schutzvorrichtungen verwendet. Dies sieht folgendermaßen aus:
#ifndef _a_h_included_
#define _a_h_included_
typedef int my_number;
#endif
Die Datei b.c
würde nach der Vorverarbeitung noch zweimal den gesamten Inhalt des Headers enthalten. Die zweite Instanz würde jedoch ignoriert, da das Makro _a_h_included_
bereits definiert worden wäre.
Das funktioniert sehr gut, hat aber zwei Nachteile. Zunächst müssen die Include-Guards geschrieben werden, und der Makroname muss in jedem Header unterschiedlich sein. Und zweitens muss der Compiler noch nach der Header-Datei suchen und sie so oft lesen, wie sie enthalten ist.
Objective-C verfügt über die #import
Präprozessoranweisung (sie kann mit einigen Compilern und Optionen auch für C- und C ++ - Code verwendet werden). Dies macht fast das Gleiche wie #include
, merkt aber auch intern an, welche Datei bereits enthalten ist. Die #import
Zeile wird erst beim ersten Auftreten durch den Inhalt der benannten Datei ersetzt. Jedes Mal danach wird es einfach ignoriert.