Ich stelle oft fest, dass der Header-Bereich einer Datei immer größer wird, aber nie kleiner wird. Während des gesamten Lebens einer Quelldatei wurden Klassen möglicherweise verschoben und überarbeitet, und es ist sehr wahrscheinlich, dass es einige gibt #includes
, die nicht mehr vorhanden sein müssen. Wenn Sie sie dort belassen, verlängern Sie nur die Kompilierungszeit und fügen unnötige Kompilierungsabhängigkeiten hinzu. Der Versuch herauszufinden, welche noch benötigt werden, kann ziemlich mühsam sein.
Gibt es ein Tool, das überflüssige # include-Anweisungen erkennen und vorschlagen kann, welche ich sicher entfernen kann?
Tut Lint das vielleicht?
c++
c
refactoring
include
dependencies
shoosh
quelle
quelle
Antworten:
Es ist nicht automatisch, aber doxygen erstellt Abhängigkeitsdiagramme für
#included
Dateien. Sie müssen sie visuell durchgehen, aber sie können sehr nützlich sein, um sich ein Bild davon zu machen, was was verwendet.quelle
Googles cppclean (Links zu: Download , Dokumentation ) kann verschiedene Kategorien von C ++ - Problemen finden und es kann jetzt überflüssige #includes finden.
Es gibt auch ein Clang-basiertes Tool, einschließlich-was-Sie-verwenden , das dies tun kann. include-what-you-use kann sogar Vorwärtsdeklarationen vorschlagen (damit Sie nicht so viel # einschließen müssen) und optional Ihre # Einschlüsse für Sie bereinigen.
In aktuellen Versionen von Eclipse CDT ist diese Funktion ebenfalls integriert: Wenn Sie im Menü "Quelle" auf "Includes organisieren" klicken, werden Ihre # Includes alphabetisch sortiert, alle von Eclipse verwendeten Header hinzugefügt, ohne sie direkt einzuschließen, und alle nicht verwendeten Header auskommentiert Ich glaube nicht, dass du brauchst. Diese Funktion ist jedoch nicht 100% zuverlässig.
quelle
Schauen Sie sich auch include-what-you-use an , um ein ähnliches Problem zu lösen.
quelle
Das Problem beim Erkennen überflüssiger Includes besteht darin, dass es sich nicht nur um eine Typabhängigkeitsprüfung handeln kann. Ein überflüssiges Include ist eine Datei, die für die Kompilierung keinen Wert liefert und kein anderes Element ändert, von dem andere Dateien abhängen. Es gibt viele Möglichkeiten, wie eine Header-Datei eine Kompilierung ändern kann, indem sie beispielsweise eine Konstante definiert, ein verwendetes Makro neu definiert und / oder löscht und einen Namespace hinzufügt, der die Suche nach einem Namen später ändert. Um Elemente wie den Namespace zu erkennen, benötigen Sie viel mehr als einen Präprozessor. Tatsächlich benötigen Sie fast einen vollständigen Compiler.
Lint ist eher ein Style Checker und wird sicherlich nicht diese volle Fähigkeit haben.
Ich denke, Sie werden die einzige Möglichkeit finden, ein überflüssiges Include zu erkennen, indem Sie Suiten entfernen, kompilieren und ausführen.
quelle
Ich dachte, dass PCLint dies tun würde, aber es ist ein paar Jahre her, seit ich es mir angesehen habe. Sie könnten es überprüfen.
Ich habe mir diesen Blog angesehen und der Autor hat ein wenig über die Konfiguration von PCLint gesprochen, um nicht verwendete Includes zu finden. Könnte einen Blick wert sein.
quelle
Der CScout- Refactoring-Browser kann überflüssige Include-Anweisungen in C-Code (leider nicht C ++) erkennen. Eine Beschreibung der Funktionsweise finden Sie in diesem Zeitschriftenartikel.
quelle
Sie können ein schnelles Skript schreiben, das eine einzelne # include-Direktive löscht, die Projekte kompiliert und den Namen in #include und der Datei protokolliert, aus der es entfernt wurde, falls keine Kompilierungsfehler aufgetreten sind.
Lassen Sie es während der Nacht laufen, und am nächsten Tag erhalten Sie eine 100% korrekte Liste der Include-Dateien, die Sie entfernen können.
Manchmal funktioniert Brute-Force einfach :-)
edit: und manchmal nicht :-). Hier einige Informationen aus den Kommentaren:
quelle
Es tut uns leid, hier (erneut) zu posten, die Leute erweitern Kommentare oft nicht.
Überprüfen Sie meinen Kommentar zu crashmstr, FlexeLint / PC-Lint wird dies für Sie tun. Informationsnachricht 766. In Abschnitt 11.8.1 meines Handbuchs (Version 8.0) wird dies erläutert.
Auch und dies ist wichtig, iterieren Sie so lange, bis die Nachricht verschwindet . Mit anderen Worten, nachdem Sie nicht verwendete Header entfernt und Lint erneut ausgeführt haben, werden möglicherweise mehr Header-Dateien "nicht benötigt", sobald Sie einige nicht benötigte Header entfernen. (Das mag albern klingen, langsam lesen und analysieren, es macht Sinn.)
quelle
Ich habe noch nie ein vollwertiges Tool gefunden, das Ihre Anforderungen erfüllt. Das nächste, was ich verwendet habe, ist IncludeManager , mit dem Ihr Header-Einschlussbaum grafisch dargestellt wird , sodass Sie beispielsweise in nur einer Datei enthaltene Header und kreisförmige Header-Einschlüsse visuell erkennen können.
quelle
Ich habe versucht, Flexelint (die Unix-Version von PC-Lint) zu verwenden, und hatte etwas gemischte Ergebnisse. Dies liegt wahrscheinlich daran, dass ich an einer sehr großen und knotigen Codebasis arbeite. Ich empfehle, jede Datei, die als nicht verwendet gemeldet wird, sorgfältig zu prüfen.
Die Hauptsorge sind Fehlalarme. Mehrere Includes desselben Headers werden als nicht benötigter Header gemeldet. Dies ist schlecht, da Flexelint Ihnen nicht sagt, in welcher Zeile der Header enthalten ist oder wo er zuvor enthalten war.
Eine der Möglichkeiten, wie automatisierte Tools dies falsch machen können:
In A.hpp:
In B.hpp:
In C.cpp:
Wenn Sie den Nachrichten von Flexelint blind folgen, werden Sie Ihre # include-Abhängigkeiten durcheinander bringen. Es gibt mehr pathologische Fälle, aber im Grunde müssen Sie die Header selbst überprüfen, um die besten Ergebnisse zu erzielen.
Ich empfehle diesen Artikel über Physical Structure und C ++ aus dem Blog Games from inside. Sie empfehlen einen umfassenden Ansatz zur Bereinigung des # include-Chaos:
quelle
Wenn Sie Eclipse CDT verwenden, können Sie http://includator.com ausprobieren, das für Betatester (zum Zeitpunkt dieses Schreibens) kostenlos ist und überflüssige #includes automatisch entfernt oder fehlende hinzufügt. Für Benutzer mit FlexeLint oder PC-Lint, die Elicpse CDT verwenden, ist http://linticator.com möglicherweise eine Option (auch kostenlos für den Betatest). Während die Analyse von Lint verwendet wird, bietet es Schnellkorrekturen zum automatischen Entfernen der überflüssigen # include-Anweisungen.
quelle
In diesem Artikel wird eine Technik zum Entfernen von #include mithilfe der Analyse von Doxygen erläutert. Das ist nur ein Perl-Skript, daher ist es recht einfach zu bedienen.
quelle
Vielleicht etwas spät, aber ich habe einmal ein WebKit-Perl-Skript gefunden, das genau das tat, was Sie wollten. Ich glaube, es muss angepasst werden (ich bin nicht gut mit Perl vertraut), aber es sollte den Trick machen:
http://trac.webkit.org/browser/branches/old/safari-3-2-branch/WebKitTools/Scripts/find-extra-includes
(Dies ist ein alter Zweig, da Trunk die Datei nicht mehr hat.)
quelle
Es gibt ein kostenloses Tool Include File Dependencies Watcher, das in das Visual Studio integriert werden kann. Es zeigt überflüssige #includes in rot.
quelle
Es gibt zwei Arten überflüssiger # include-Dateien:
Meiner Erfahrung nach gibt es zwei Möglichkeiten, um es zu erkennen:
gcc -H oder cl.exe / showincludes (Problem 2 lösen)
In der realen Welt können Sie CFLAGS = -H vor make exportieren, wenn nicht alle Makefile-Optionen CFLAGS überschreiben. Oder wie ich es verwendet habe, können Sie einen cc / g ++ - Wrapper erstellen, um jedem Aufruf von $ (CC) und $ (CXX) zwangsweise -H-Optionen hinzuzufügen. Wenn Sie das Verzeichnis des Wrappers der Variablen $ PATH voranstellen, verwendet Ihr make stattdessen den Wrapper-Befehl. Natürlich sollte Ihr Wrapper den echten gcc-Compiler aufrufen. Diese Tricks müssen geändert werden, wenn Ihr Makefile gcc direkt verwendet. anstelle von $ (CC) oder $ (CXX) oder nach impliziten Regeln.
Sie können auch eine einzelne Datei kompilieren, indem Sie mit der Befehlszeile optimieren. Aber wenn Sie Header für das gesamte Projekt bereinigen möchten. Sie können die gesamte Ausgabe erfassen, indem Sie:
sauber machen
mache 2> & 1 | tee result.txt
PC-Lint / FlexeLint (Problem 1 und 2 lösen)
Stellen Sie sicher, dass Sie die Optionen + e766 hinzufügen. Bei dieser Warnung geht es um: nicht verwendete Header-Dateien.
pclint / flint -vf ...
Dies führt dazu, dass die pclint-Ausgabe Header-Dateien enthält. Verschachtelte Header-Dateien werden entsprechend eingerückt.
quelle
Um diese Diskussion zu beenden: Der C ++ - Präprozessor ist vollständig. Es ist eine semantische Eigenschaft, ob ein Include überflüssig ist. Aus dem Satz von Rice folgt daher, dass es unentscheidbar ist, ob ein Include überflüssig ist oder nicht. Es kann kein Programm geben, das (immer richtig) erkennt, ob ein Include überflüssig ist.
quelle
Hier ist eine einfache Brute-Force-Methode zum Identifizieren überflüssiger Header-Includes . Es ist nicht perfekt, eliminiert aber die "offensichtlichen" unnötigen Einschlüsse. Diese zu beseitigen, trägt wesentlich zur Bereinigung des Codes bei.
Auf die Skripte kann direkt auf GitHub zugegriffen werden.
quelle
PC Lint von Gimpel Software kann melden, wenn eine Include-Datei mehr als einmal in einer Kompilierungseinheit enthalten
war, kann jedoch keine Include-Dateien finden, die nicht so benötigt werden, wie Sie es suchen.Bearbeiten: Es kann. Siehe die Antwort von itsmatt
quelle
CLion , die C / C ++ - IDE von JetBrains, erkennt sofort redundante Includes. Diese sind im Editor abgeblendet, es gibt jedoch auch Funktionen zum Optimieren von Includes in der aktuellen Datei oder im gesamten Projekt .
Ich habe festgestellt, dass Sie für diese Funktionalität bezahlen. Es dauert eine Weile, bis CLion Ihr Projekt beim ersten Laden scannt und analysiert.
quelle