6
votes

Fichier d'en-tête égal à différents chemins incluent

Disons que nous avons deux fichiers d'en-tête: /directory1/a.hpp et Directory2 / A.HPP . Le contenu de ces deux en-têtes est différent !

Notre cible de construction A.CPP a besoin Directory1 et Directory2 Comme include les chemins, car il existe d'autres fichiers d'en-tête nécessaires dans les deux répertoires. < / p>

Maintenant, dans A.CPP Il y a un #include "A.HPP" instruction.

Quelle version de A.HPP Le pré-processeur choisira-t-il?

n'est-il probablement que si l'on fonctionne avec un logiciel tiers, que cette situation pourrait donc se produire?


4 commentaires

Je pense que le compilateur remplace simplement la ligne #include avec le contenu du fichier, de sorte que le nom n'a pas d'importance.


Si vous utilisez #pragma une fois ou une protection include, cela n'aura pas d'importance, car le contenu n'est inséré qu'une seule fois.


Désolé, j'ai oublié de mentionner ce qui se passe si les deux fichiers d'en-tête sont différents, voir Modifier.


Espaces de noms, espaces de noms, espaces de noms, partout . Les noms de fichier sont des noms aussi, ils ont donc besoin d'espaces de noms. Tirez sur les deux auteurs de la bibliothèque.


4 Réponses :


3
votes

Cela dépendra de vos options de compilation, et plus particulièrement de votre chemin incluent.

Si répertoire1 est dans le chemin Inclure, ce sera le /directory1/a.hpp , sinon si le répertoire2 est dans le chemin Inclure, ce sera le / a répertoire2 / a .HPP . Si Directory1 et Directory2 sont tous les deux dans le chemin Inclure, le compilateur vous demandera de spécifier le répertoire, comme #include "Directory1 / A.HPP" . .


1 commentaires

Cela ne vous «demandera pas de préciser» quoi que ce soit dans le dernier cas. C'est "d'abord trouvé" (qui signifie généralement la première liste énumérés dans la liste des annuaires inclus).



5
votes

La directive Inclure avec Double citations Colle le fichier référencé sous sa forme littérale. Le chemin de fichier est considéré comme étant relatif à l'emplacement du fichier source.

Donc, si vous aviez #include "Directory1 / A.HPP" , il inclura l'évidence une. Si vous #include ou #include "A.HPP" , cela dépend d'une première apparition dans votre chemin de recherche.

Généralement, vous devez avoir des noms spécifiques et descriptifs pour empêcher la contention ici. L'utilisation de répertoires de la même manière que vous utiliseriez un espace de noms C ++ est une pratique suffisante. Regardez la structure des bibliothèques comme LibxML ++ et GTKMM.


0 commentaires

10
votes

Que se passe-t-il dans ce cas dépend du compilateur en question (consultez les documents du compilateur que vous utilisez).

Des situations comme celles-ci sont la raison pour laquelle utiliser des noms d'en-tête "non qualifiés" est généralement une mauvaise idée. Structez toujours vos annuaires incluent une partie de la voie d'un élément nécessaire du nom. E.g. xxx

au lieu de xxx


0 commentaires

1
votes

Les choix du compilateur incluent des fichiers dans l'ordre que les répertoires Include sont répertoriés en tant qu'arguments sur -I . Le premier fichier trouvé est utilisé.

Dans un cas où il y a deux fichiers avec le même nom, vous devez spécifier lequel vous voulez dans le fichier source.


0 commentaires