198 votes

Afficher la hiérarchie #include d'un fichier C++ dans Visual Studio

Problème : J'ai un gros projet Visual C++ que j'essaie de migrer vers Visual Studio 2010. Il s'agit d'un énorme mélange d'éléments provenant de différentes sources et de différents âges. Je rencontre des problèmes parce que quelque chose inclut à la fois winsock.h y winsock2.h .

Question : Quels sont les outils et les techniques permettant d'afficher les #include hiérarchie pour un fichier source de Visual Studio C++ ?

Je connais cl /P pour obtenir la sortie du préprocesseur, mais cela ne montre pas clairement quel fichier inclut quels autres fichiers (et dans ce cas, le fichier /P la sortie est longue de 376 932 lignes 8-)

Dans un monde parfait, j'aimerais avoir un affichage hiérarchique des fichiers qui incluent d'autres fichiers, ainsi que les numéros de ligne afin de pouvoir accéder aux sources :

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

5 votes

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

292voto

xtofl Points 22333

Il y a un réglage :

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

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

0 votes

C'est exactement ce que je recherchais (à l'exception des numéros de ligne, mais on ne peut pas tout avoir). Idiot, je cherchais dans les options du préprocesseur. 8-) Merci !

25 votes

Remarque : la hiérarchie est visible dans la fenêtre de sortie.

3 votes

Si cela intéresse quelqu'un : même si vous sélectionnez l'option Clang ensemble d'outils de la plate-forme vous pouvez encore "montrer des inclusions" si vous ajoutez -H en C/C++ -> Command Line - Additional Options

25voto

Kim Gräsman Points 5027

Le compilateur supporte également le commutateur /showIncludes -- il ne vous donne pas les numéros de ligne, mais peut vous donner une vue assez complète des inclusions qui viennent d'où.

Il se trouve sous Project Settings -> Configuration Properties -> C/C++ -> Advanced -> Show Includes.

0 votes

+1 Merci beaucoup ! (Mais j'ai bien peur que ce soit xtofl qui obtienne l'acceptation pour avoir été plus rapide).

16voto

Colin Desmond Points 2946

Nous avons trouvé IncludeManager est un outil très puissant. Il n'est pas gratuit (mais pas cher) et il nous a permis d'appréhender nos problèmes d'inclusion et de réduire notre temps de compilation de 50 minutes à 8 minutes en élaguant de gros morceaux d'inclusions que nous n'utilisions pas.

5 votes

Yow ! J'ai lancé IncludeManager sur le fichier incriminé et j'ai obtenu un graphique qui m'a fait rire aux éclats. D'après mes calculs, il me faudrait un écran de 400 pouces pour voir l'ensemble. Je pense qu'il n'est pas en mesure de nous aider. 8-)

3 votes

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

0 votes

Le lien IncludeManager a été modifié en septembre 21 : profactor.co.uk/home

3voto

Daniel F. Thornton Points 3024

Ici est un bon outil tiers et libre. 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.

1voto

polyglot Points 1143

cl /P devrait vous indiquer les numéros de ligne, afin que vous puissiez savoir dans quel contexte un fichier d'en-tête est inclus.

Si vous extrayez les lignes avec ...

grep "^#line" file.i

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

S'il s'agit d'un incident isolé, le diagnostic devrait être assez rapide.

2 votes

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

0 votes

Cela faisait assez longtemps que j'examinais les résultats de cl /P et que je me demandais s'il n'existait pas un meilleur outil pour ce travail. Je viens de découvrir que c'est le cas, ce qui est formidable. La question es général, et les réponses seront ici sur SO pour toujours, pour que d'autres puissent les trouver.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X