Affichage de la hiérarchie #include pour un fichier C ++ dans Visual Studio


169

Problème: j'ai un grand projet Visual C ++ que j'essaie de migrer vers Visual Studio 2010. C'est un énorme mélange de trucs de différentes sources et d'âges différents. J'ai des problèmes parce que quelque chose inclut à la fois winsock.het winsock2.h.

Question: Quels outils et techniques sont disponibles pour afficher la #includehiérarchie d'un fichier source Visual Studio C ++?

Je sais comment cl /Pobtenir la sortie du préprocesseur, mais cela ne montre pas clairement quel fichier comprend quels autres fichiers (et dans ce cas, la /Psortie fait 376932 lignes 8-)

Dans un monde parfait, j'aimerais un affichage hiérarchique des fichiers contenant quels autres fichiers, ainsi que des numéros de ligne pour que je puisse accéder aux sources:

source.cpp(1)
  windows.h(100)
    winsock.h
  some_other_thing.h(1234)
    winsock2.h

2
Pour les personnes qui recherchent une solution GCC / Clang, utilisez gcc -H -fsyntax-only ...pour afficher la hiérarchie. Crédits à stackoverflow.com/a/18593344/427545
Lekensteyn

Réponses:


234

Il y a un cadre:

Paramètres du projet -> Propriétés de configuration -> C / C ++ -> Avancé -> Afficher comprend

qui générera l'arbre. Il correspond au commutateur / showIncludes du compilateur


20
Remarque: la hiérarchie est visible dans la fenêtre Sortie.
CannibalSmith

3
Si toute personne intéressée de: même si vous sélectionnez le Clang ensemble d' outils de la plate - forme , vous pouvez toujours « show comprend » si vous ajoutez -HàC/C++ -> Command Line - Additional Options
wip

3
Toujours pas aussi bon que la fonction "inclus depuis" de gcc, qui montre la hiérarchie d'inclusion directe liée à une erreur de compilation, et qui affiche également les numéros de ligne.
Paul

2
J'ai créé une expression régulière rapide qui supprime les inclusions de Visual Studio (tout ce qui se trouve sous Program Files (x86)). Vous pouvez copier + coller votre fenêtre de sortie dans une application comme Notepad ++ et faire une regex find and replace with blank pour supprimer toutes les VS inclus de votre arbre:1>\s*Note: including file:\s*C:\\Program Files \(x86\).*(\r\n|\n|$)
kjhf

2
Notez que si / showIncludes peut être basculé pour un fichier source individuel, il n'aura aucun effet à moins que / showIncludes ne soit défini au niveau du projet.
David Carr

20

Le compilateur prend également en charge un commutateur / showIncludes - il ne vous donne pas de numéros de ligne, mais peut donner une vue assez complète des inclusions provenant d'où.

C'est sous Paramètres du projet -> Propriétés de configuration -> C / C ++ -> Avancé -> Afficher comprend.


+1 Merci beaucoup! (Mais j'ai peur que xtofl obtienne l'acceptation pour être plus rapide).
RichieHindle

17

Nous avons trouvé IncludeManager comme un outil très puissant. Ce n'est pas gratuit (mais pas cher) et cela nous a permis de maîtriser nos problèmes d'inclusion et de réduire notre temps de compilation de 50 minutes à 8 minutes en éliminant de gros morceaux d'inclusions que nous n'utilisions pas.


5
Yow! J'ai exécuté IncludeManager sur le fichier incriminé, et cela a produit un graphique qui m'a fait rire aux éclats. D'après mes calculs, j'aurais besoin d'un écran de 400 "pour voir le tout. Je pense que nous sommes au-delà de sa capacité d'aider. 8-)
RichieHindle

2
Mise à jour - la société mère d’InclusManager, ProFactor (www.profactor.co.uk), a cessé ses activités, mais fournit ses versions les plus récentes gratuitement à partir du site Web ci-dessus. L'inconvénient est que cela ne fonctionne que sur les versions complètes de Visual Studio de VS2005 à VS2013.
Dana

5

Pas aussi bon que la fonction d'inclusion hiérarchique de gcc, qui montre la hiérarchie d'inclusion en ligne directe en cas d'erreur. L'option "show includes" dans VS montre tout, ce qui est excessif lors du débogage des problèmes de fichiers d'inclusion hiérarchiques.


J'attends cela depuis 5 ans déjà, que j'ai utilisé avec mingw.
fantastique

2
Peut-être ajouter quelques détails sur la façon de l'utiliser, où se trouve la documentation, etc.? Cette réponse n'ajoute pas grand chose actuellement.
Sam Brightman

4

Voici un bon outil FOSS tiers. Vous pouvez exporter les résultats au format XML, qui comprendra des données sur le nombre d'occurrences et les numéros de ligne.


4

Il existe maintenant un plugin pour Visual Studio appelé IncludeToolbox . Il peut lister vos inclusions dépendantes et faire plus de choses comme une suppression et une compilation aléatoires pour voir si cette inclusion était requise.



2

cl / P devrait vous montrer les numéros de ligne, de sorte que vous puissiez dire le contexte d'où un fichier d'en-tête est inclus.

Si vous écrasez les lignes avec ...

grep "^ # line" file.i

... alors vous devriez avoir une indication assez claire des fichiers rencontrés dans l'ordre par le préprocesseur.

S'il s'agit d'un incident ponctuel, cela devrait être un diagnostic assez rapide.


2
Bien sûr, mais cela me donne huit mille lignes de sortie non structurée, sans hiérarchie.
RichieHindle

J'avais regardé à travers la sortie cl / P pendant assez longtemps et je me demandais s'il y avait un meilleur outil pour le travail. Maintenant, j'ai découvert qu'il y en a, ce qui est génial. La question est générale, et les réponses seront ici sur SO pour toujours, pour que d'autres les trouvent.
RichieHindle

0

J'utilise Doxygen et GraphViz .

entrez la description de l'image ici

Installez les deux. Assurez-vous de sélectionner GraphViz comme outil pour générer les diagrammes de hiérarchie. Sélectionnez "Utiliser l'outil point du package GraphVix".

Assurez-vous également d'inclure le répertoire binaire de GraphViz dans votre variable d'environnement PATH.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.