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:

Les entêtes (inclus avec #include <entete>) sont cherchés:

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:

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).