Il semble y avoir beaucoup de confusion concernant le préprocesseur.
Ce que fait le compilateur lorsqu'il voit #include
qu'il remplace cette ligne par le contenu des fichiers inclus, aucune question n'est posée.
Donc, si vous avez un fichier a.h
avec ce contenu:
typedef int my_number;
et un fichier b.c
avec ce contenu:
#include "a.h"
#include "a.h"
le fichier b.c
sera traduit par le préprocesseur avant la compilation en
typedef int my_number;
typedef int my_number;
ce qui entraînera une erreur de compilation, car le type my_number
est défini deux fois. Même si la définition est la même, cela n'est pas autorisé par le langage C.
Comme un en-tête est souvent utilisé à plusieurs endroits, les gardes sont généralement utilisés en C. Cela ressemble à ceci:
#ifndef _a_h_included_
#define _a_h_included_
typedef int my_number;
#endif
Le fichier b.c
contiendrait toujours l'intégralité du contenu de l'en-tête deux fois après avoir été prétraité. Mais la deuxième instance serait ignorée car la macro _a_h_included_
aurait déjà été définie.
Cela fonctionne vraiment bien, mais présente deux inconvénients. Tout d'abord, les gardes d'inclusion doivent être écrits et le nom de la macro doit être différent dans chaque en-tête. Et deuxièmement, le compilateur doit toujours chercher le fichier d'en-tête et le lire aussi souvent qu'il est inclus.
Objective-C possède l' #import
instruction de préprocesseur (elle peut également être utilisée pour le code C et C ++ avec certains compilateurs et options). Cela fait presque la même chose #include
, mais il note également en interne quel fichier a déjà été inclus. La #import
ligne est uniquement remplacée par le contenu du fichier nommé pour la première fois qu'il est rencontré. Chaque fois après cela, il est simplement ignoré.