Il semble y avoir beaucoup de confusion concernant le préprocesseur.
Ce que le compilateur ne quand il voit un #include
qu'il remplace cette ligne avec le contenu des fichiers inclus, sans poser de questions.
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
seront traduits par le préprocesseur avant la compilation de
typedef int my_number;
typedef int my_number;
ce qui résultera en une erreur de compilation, puisque le type my_number
est définie deux fois. Même si la définition est la même, ce n'est pas permis par le langage C.
Depuis un en-tête est souvent utilisé en plus d'un lieu d'inclure 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
encore l'ensemble du contenu de l'en-tête en deux fois après avoir été prétraitées. Mais, dans le deuxième exemple, pourrait être ignorée, car la macro _a_h_included_
ont déjà été définis.
Cela fonctionne vraiment bien, mais elle a deux inconvénients. Tout d'abord inclure les gardes les ont écrites, et le nom de la macro doit être différente dans chaque en-tête. Et d'autre part que le compilateur doit toujours rechercher le fichier d'en-tête et de le lire autant de fois qu'il est inclus.
Objective-C a l' #import
instructions de préprocesseur (il peut également être utilisé pour le code C et C++ avec certains compilateurs et des options). Cela fait à peu près la même que #include
, mais il prend également note interne de laquelle le fichier a déjà été inclus. L' #import
ligne est remplacé par le contenu du fichier nommé pour la première fois, il est rencontré. Chaque fois qu'il est simplement ignoré.