Anzeigen der # include-Hierarchie für eine C ++ - Datei in Visual Studio

168

Problem: Ich habe ein großes Visual C ++ - Projekt, das ich auf Visual Studio 2010 migrieren möchte. Es ist eine riesige Mischung aus Dingen aus verschiedenen Quellen und unterschiedlichen Alters. Ich bekomme Probleme, weil etwas beides winsock.hund beinhaltet winsock2.h.

Frage: Welche Tools und Techniken gibt es zum Anzeigen der #includeHierarchie für eine Visual Studio C ++ - Quelldatei?

Ich weiß, cl /Pwie man die Präprozessorausgabe erhält, aber das zeigt nicht klar, welche Datei welche anderen Dateien enthält (und in diesem Fall ist die /PAusgabe 376.932 Zeilen lang, 8-)

In einer perfekten Welt möchte ich eine hierarchische Anzeige, welche Dateien welche anderen Dateien enthalten, zusammen mit Zeilennummern, damit ich in die Quellen springen kann:

source.cpp(1)
  windows.h(100)
    winsock.h
  some_other_thing.h(1234)
    winsock2.h
RichieHindle
quelle
2
Verwenden Sie für Personen, die nach einer GCC / Clang-Lösung suchen, die gcc -H -fsyntax-only ...Ausgabe der Hierarchie. Credits zu stackoverflow.com/a/18593344/427545
Lekensteyn

Antworten:

233

Es gibt eine Einstellung:

Projekteinstellungen -> Konfigurationseigenschaften -> C / C ++ -> Erweitert -> Includes anzeigen

das wird den Baum erzeugen. Es wird dem Compiler switch / showIncludes zugeordnet

xtofl
quelle
20
Hinweis: Die Hierarchie wird im Ausgabefenster angezeigt.
CannibalSmith
3
Wenn jemand interessiert: auch wenn Sie den Clang wählen Plattform Toolset , können Sie nach wie vor „Show beinhaltet“ , wenn Sie hinzufügen , -HinC/C++ -> Command Line - Additional Options
wip
3
Immer noch nicht so gut wie die Funktion "eingeschlossen von" von gcc, die die direkte Include-Hierarchie in Bezug auf einen Fehler bei der Kompilierung anzeigt und auch Zeilennummern anzeigt.
Paul
2
Ich habe eine schnelle Regex erstellt, die das Visual Studio entfernt (alles unter Programme (x86)). Sie können Ihr Ausgabefenster kopieren und in eine App wie Notepad ++ einfügen und eine Regex-Suche durchführen und durch ein Leerzeichen ersetzen, um alle VS-Includes aus Ihrem Baum zu 1>\s*Note: including file:\s*C:\\Program Files \(x86\).*(\r\n|\n|$)
entfernen
2
Beachten Sie, dass / showIncludes zwar für eine einzelne Quelldatei umgeschaltet werden kann, jedoch keine Auswirkungen hat, es sei denn, / showIncludes ist auf Projektebene festgelegt.
David Carr
20

Der Compiler unterstützt auch einen / showIncludes-Schalter - er gibt Ihnen keine Zeilennummern, kann aber eine ziemlich umfassende Ansicht darüber geben, welche Includes von woher kommen.

Es befindet sich unter Projekteinstellungen -> Konfigurationseigenschaften -> C / C ++ -> Erweitert -> Includes anzeigen.

Kim Gräsman
quelle
+1 Vielen Dank! (Aber ich fürchte, xtofl bekommt die Akzeptanz dafür, schneller zu sein).
RichieHindle
17

Wir haben festgestellt, dass IncludeManager ein sehr leistungsfähiges Tool ist. Es ist nicht kostenlos (aber nicht teuer) und hat es uns ermöglicht, unsere Include-Probleme in den Griff zu bekommen und unsere Kompilierungszeit von 50 Minuten auf 8 Minuten zu verkürzen, indem wir große Teile von Includes herausgeschnitten haben, die wir nicht verwendet haben.

Colin Desmond
quelle
5
Yow! Ich habe IncludeManager für die fehlerhafte Datei ausgeführt und ein Diagramm erstellt, das mich zum Lachen brachte. Nach meinen Berechnungen würde ich einen 400-
Zoll-
2
Update - Die Muttergesellschaft von IncludeManager, ProFactor (www.profactor.co.uk), hat ihr Geschäft eingestellt, bietet jedoch die neuesten Versionen kostenlos auf der oben genannten Website an. Der Nachteil ist, dass es nur mit Vollversionen von Visual Studio von VS2005 bis VS2013 funktioniert.
Dana
5

Nicht so gut wie die hierarchische Include-Funktion von gcc, die im Fehlerfall die direkte Einschlusshierarchie anzeigt. Die Option "show include" in VS zeigt alles an, was beim Debuggen von Problemen mit hierarchischen Include-Dateien übertrieben ist.

Paul
quelle
Ich warte schon seit 5 Jahren darauf, was ich mit mingw benutzt habe.
fantastische
2
Fügen Sie vielleicht einige Details zur Verwendung hinzu, wo sich die Dokumentation befindet usw.? Diese Antwort fügt derzeit nicht viel hinzu.
Sam Brightman
4

Hier ist ein gutes FOSS-Tool von Drittanbietern. Sie können Ergebnisse nach XML exportieren, die Daten zur Anzahl der Vorkommen und Zeilennummern enthalten.

Daniel F. Thornton
quelle
4

Es gibt jetzt ein Plugin für Visual Studio namens IncludeToolbox . Es kann Ihre abhängigen Includes auflisten und weitere Aktionen wie das zufällige Entfernen und Kompilieren ausführen, um festzustellen, ob dieses Include erforderlich war.

Fantastischer Mr. Fox
quelle
2

cl / P sollte Ihnen die Zeilennummern anzeigen, damit Sie den Kontext erkennen können, aus dem eine Header-Datei stammt.

Wenn Sie die Zeilen mit ...

grep "^ # line" file.i.

... dann sollten Sie einen ziemlich sauberen Hinweis darauf haben, welche Dateien in der Reihenfolge vom Präprozessor gefunden wurden.

Wenn es sich um einen einmaligen Vorfall handelt, sollte dies eine ziemlich schnelle Diagnose sein.

mehrsprachig
quelle
2
Sicher, aber das gibt mir achttausend Zeilen unstrukturierter Ausgabe ohne Hierarchie.
RichieHindle
Ich hatte die cl / P-Ausgabe ziemlich lange genug durchgesehen und mich gefragt, ob es ein besseres Werkzeug für den Job gibt. Jetzt habe ich festgestellt, dass es das gibt, was großartig ist. Die Frage ist allgemein und die Antworten werden für immer hier auf SO sein, damit andere sie finden können.
RichieHindle
0

Ich benutze Doxygen und GraphViz .

Geben Sie hier die Bildbeschreibung ein

Installieren Sie beide. Stellen Sie sicher, dass Sie GraphViz als Werkzeug zum Generieren der Hierarchiediagramme auswählen. Wählen Sie "Punktwerkzeug aus dem GraphVix-Paket verwenden".

Stellen Sie außerdem sicher, dass das Binärverzeichnis von GraphViz in Ihre Umgebungsvariable PATH aufgenommen wird.

Santiago Villafuerte
quelle