Recherche des fichiers inclus
Comportement requis
Les normes des langages C et C++ spécifient relativement peu de choses
quant au comportement des directives #include <entete>
et #include "fichier"
.
La première est replacée par le contenu d'un entête identifié par la séquence de caractères se trouvant entre < et >. Ce qu'est un entête (et en quoi c'est différent d'un fichier source) et comment il est trouvé est défini par l'implémentation.
La deuxième est remplacée par le contenu d'un fichier source identifié par la séquence de caractères se trouvant entre les ". Si le fichier n'est pas trouvé, un entête identifié par la même séquence de caractère est alors cherché.
Les normes permettent une troisième forme #include
pp-tokens
encore moins précisément spécifiée. Les
pp-tokens
subissent l'expansion de macro puis sont transformés
d'une manière qui dépend de l'implémentation -- et que les implémentations
-- décrivent rarement, gcc
étant une exception notable.
Comportement quasiment universel
Pour la plupart des compilateurs, entêtes et fichiers sources sont la même chose: des fichiers. Ils permettent aussi de spécifier une liste de répertoire où chercher les fichiers inclus.
Les fichiers sources (inclus avec #include "fichier"
) sont
cherchés:
- dans le répertoire du fichier contenant la directive d'inclusion;
- dans les répertoires spécifiés par l'utilisateur;
- dans une liste de répertoire cherchées par défaut.
Les entêtes (inclus avec #include <entete>
) sont
cherchés:
- dans les répertoires spécifiés par l'utilisateur;
- dans une liste de répertoire définis par l'implémentation.
Exceptions
Si ce comportement est le plus courant, il est impossible de l'obtenir avec certains compilateurs.
Visual C++
Le comportement de Visual C++ s'approche de ce comportement, mais il cherche les fichiers sources non seulement dans le répertoire du fichier contenant la directive mais aussi dans les répertoires des fichiers incluant directement ou indirectement ce fichier.
Metrowerks CodeWarrior
Les anciennes versions de CodeWarrior ne permettaient pas de chercher dans le répertoire contenant la directive. Les nouvelles le permettent.
Autres comportements
Liste de répertoires spécifiques aux fichiers sources
Il est commun de pouvoir spécifier une liste de répertoires cherchés
uniquement pour les fichiers sources (inclus avec #include
"fichier"
). L'utilisation de cette possibilité désactive
généralement la recherche dans le répertoire du fichier contenant la
directive, ce qui est gênant.
Les compilateurs qui ont cette possiblités comprennent:
- gcc
- comeau
- Sun CC (SparcWorks et Forte)
- HP aCC
- Metrowerks CodeWarrior
Recherche dans les sous-répertoires
Metrowerks CodeWarrior permet d'indiquer pour chacun des répertoires donnés par l'utilisateur que la recherche doit être récursive, c'est à dire que les sous-répertoires doivent aussi être cherchés.
Comportements rapportés
Certains compilateurs rechercheraient d'abord les fichiers inclus avec
#include ""
non pas dans le répertoire du fichier contenant la
directive mais dans le répertoire où est exécuté le compilateur. Un
système incriminé serait VMS, mais je ne me souviens pas que ce soit le cas
(mais ça fait longtemps donc je peux me tromper) et ce n'est pas le cas au
moins pour le préprocesseur C distribué par DECUS (qui est disponible en
source quelque part sur le net).