“Tiefe” Header-Abhängigkeitsanalyse

Lesezeit: 2 Minuten

Benutzer-Avatar
Reinderien

Ich arbeite an einem mittelgroßen C/C++-Projekt, auf das ich bereits Doxygen+Graphviz angewendet habe. Seine Header-Grafiken sind nützlich, aber sie zeigen nur Beziehungen basierend auf #include. Ich bin daran interessiert, ein (vorzugsweise Linux-basiertes) Tool zu finden, das Dateiabhängigkeiten nicht nur basierend auf analysiert #include, sondern auf die tatsächliche Symbolverwendung. Ein solches Tool würde beispielsweise nicht nur das zeigen a.cpp beinhaltet b.haber das a.cpp Verwendet SomeClass das ist deklariert in c.h eingeschlossen von b.h. Es wäre auch in der Lage, Header-Includes vorzuschlagen, die gekürzt werden könnten.

Benutzer-Avatar
richq

Ich habe verwendet Geben Sie an, was Sie verwenden zuvor mit ziemlich guten Ergebnissen. Es verwendet Clang, um den C++-Code zu parsen und Forward-Deklarationen zum Hinzufügen und Header-Dateien zum Entfernen vorzuschlagen.

Ein Nachteil ist, dass Annahmen über das Layout Ihres Codes getroffen werden – im Grunde die Google-Codierungsstandards. Es wird also nur zugeschaut SomeFile.h wenn Sie eine Datei namens haben SomeClass.cpp. Auch die vorgeschlagenen Includes verwenden vollständige Pfade aus dem Stammverzeichnis Ihres Projekts (so #include "src/SomeClass.h" Anstatt von #include "SomeClass.h"). Am Ende habe ich meinen Code trotzdem auf diese Konvention geändert, da dies Mehrdeutigkeiten vermeidet, aber es braucht eine Warnung, falls Sie es versuchen.

Normalerweise kann man einfach einstellen CC=include-what-you-use und neu erstellen, um die Ergebnisse zu erhalten – es verwendet die gesamte Clang-Maschinerie zum Analysieren -I Argumente beinhalten. Es gibt ein Python-Programm, das das Ergebnis verwendet, um Ihre #include-Zeilen automatisch zu aktualisieren.

BEARBEITEN:

Ein weiteres Tool, das nicht so ausgefeilt ist, aber einfacher einzurichten ist und Vorschläge machen kann #includes zu entfernen ist Enthaupter. Es funktioniert, indem Sie Ihre C++-Datei an einen temporären Speicherort kopieren und eine #include und neu kompilieren. Wenn die Neukompilierung funktioniert, ist es sicher, diese Header-Datei zu entfernen. Was es nicht tut, ist Vorwärtsdeklarationen oder irgendetwas Ausgefallenes vorzuschlagen, aber es kann unnötige Include-Zeilen in Ihren Implementierungsdateien reduzieren.

  • Es scheint vielversprechend, obwohl es ein echter Schmerz ist, dass es keine zu installierenden Binärdateien hat. Und als ich anfing, llvm zu kompilieren, füllte es meine Festplatte bis zur Kapazitätsgrenze.

    – Reinderien

    4. Mai 2011 um 21:38 Uhr

  • @Reinderien Ein Auschecken und Erstellen von llvm + clang ist “nur” etwa 1 GB groß. Denken Sie daran, –enable-optimized an das Konfigurationsskript zu übergeben. Ein Debug-Build wird Sie auf etwa 4 GB zurücksetzen.

    – richq

    5. Mai 2011 um 7:07 Uhr

  • Ich konnte endlich IWYU bauen – und ja, es ist sperrig, aufgebläht usw., aber es ist besser als nichts. Den Deheader werde ich mir auch mal anschauen. Vielen Dank

    – Reinderien

    6. Mai 2011 um 0:05 Uhr

1355970cookie-check“Tiefe” Header-Abhängigkeitsanalyse

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy