web-dev-qa-db-fra.com

directive #include: relative à où?

J'ai regardé dans Le langage de programmation C++ pour essayer de trouver la réponse à cette question. Quand je #include "my_dir/my_header.hpp" dans un en-tête, où cherche-t-il ce fichier? Est-ce relatif à l'en-tête, au fichier source qui l'a inclus ou à quelque chose d'autre?

36
rlbond
25
aib

Il est relatif à la fois au fichier source actuel et aux chemins de recherche indiqués (-I pour gcc).

9

Cela dépend de la syntaxe que vous utilisez dans la directive #include:

#include "path-spec"
#include <path-spec>

Formulaire entre guillemets: ce formulaire indique au préprocesseur de rechercher les fichiers include dans le même répertoire que le fichier contenant l'instruction #include, puis dans les répertoires des fichiers contenant ce fichier (#include). Le préprocesseur recherche ensuite le chemin spécifié par l'option du compilateur/I, puis le chemin spécifié par la variable d'environnement INCLUDE.

Forme de crochet: Ce formulaire demande au préprocesseur de rechercher les fichiers d'inclusion en commençant par le chemin spécifié par l'option du compilateur/I, puis lors de la compilation à partir de la ligne de commande, le long du chemin spécifié par la variable d'environnement INCLUDE.

Path-spec est un nom de fichier éventuellement précédé d'une spécification de répertoire. Le nom de fichier doit nommer un fichier existant. La syntaxe de path-spec dépend du système d'exploitation sur lequel le programme est compilé.

Ces informations doivent figurer dans la documentation de votre référence de préprocesseur C++ spécifique. Ce qui précède est extrait de cet article sur MSDN qui contient davantage d’informations sur le sujet.

7
Peter McG

Le chemin de recherche complet peut dépendre du compilateur. Pour Visual Studio, la documentation indique que:

(...) indique au préprocesseur de rechercher les fichiers include dans le même répertoire que le fichier contenant l'instruction #include, puis dans les répertoires des fichiers contenant ce fichier (#include). Le préprocesseur recherche ensuite le chemin spécifié par l'option du compilateur/I, puis le chemin spécifié par la variable d'environnement INCLUDE.

2
noup

Sa mise en œuvre définie. Les #include "my_dir/xxy.hpp" sur un fichier (par exemple, foo.h) sont relatifs au fichier (foo.h et my_dir seraient au même niveau dans la hiérarchie des répertoires). Avec certains (la plupart?) Des compilateurs, vous pouvez utiliser un drapeau pour utiliser ces <> (#include

Je sais que gcc/g ++ fournit le drapeau -I. Vous pouvez donc utiliser g ++ -I/home [...] Pour indiquer que le fichier xxy.hpp se trouve dans le répertoire/home/mon_dir /. Je n’ai utilisé aucun autre fichier C/C++. compilateur dans un moment maintenant.

1
Tom

pour GCC version <= 3.0, la forme de crochet ne génère pas de dépendance entre le fichier inclus et le fichier inclus. Donc, si vous voulez que votre fichier makefile génère automatiquement des dépendances, vous devez utiliser le formulaire entre guillemets. les fichiers qui devraient être inclus dans l'arbre de dépendance.

0
Denis Ros