Es scheint viel Verwirrung hinsichtlich des Präprozessors zu geben.
Was der Compiler tut, wenn er sieht, #includedass er diese Zeile durch den Inhalt der enthaltenen Dateien ersetzt, ohne dass Fragen gestellt werden.
Wenn Sie also eine Datei a.hmit diesem Inhalt haben:
typedef int my_number;
und eine Datei b.cmit diesem Inhalt:
#include "a.h"
#include "a.h"
Die Datei b.cwird 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_numberzweimal 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.cwü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 #importPrä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 #importZeile wird erst beim ersten Auftreten durch den Inhalt der benannten Datei ersetzt. Jedes Mal danach wird es einfach ignoriert.