Erkennung überflüssig #include in C/C++?
Oft finde ich, dass der Header-Abschnitt der Datei größer und größer die ganze Zeit, aber es wird nie kleiner. Während des ganzen Lebens eine Quelle-Datei kann der Unterricht bewegt haben und wurde umgestaltet und es ist sehr gut möglich, dass es gibt durchaus ein paar #includes
, die nicht brauchen, dort zu sein, und nicht mehr. Sie verlassen es nur verlängern compile-Zeit und überflüssige Zusammenstellung Abhängigkeiten. Versuchen, herauszufinden, was noch gebraucht werden kann, ziemlich langweilig.
Gibt es irgendeine Art von tool, die erkennen können, überflüssig #include-Direktiven und empfehlen, welche ich sicher entfernen können?
Hat Fusseln tun Sie dies vielleicht?
- Siehe auch: stackoverflow.com/questions/74326/...
- Die verlinkten Frage, die nur scheinen, um das Problem unter Windows, mit Visual Studio insbesondere.
- Die Abstimmung zu öffnen, das, wie das Duplikat wird über die Verwendung von Visual Studio, speziell.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist nicht automatisch, aber doxygen produzieren dependency-Diagramme für
#included
- Dateien. Sie haben, um durch Sie gehen optisch, aber Sie kann sehr nützlich sein für immer ein Bild von dem, was mit, was.Google cppclean (links: download, Dokumentation) finden sich mehrere Kategorien von C++ - Probleme, und es finden nun überflüssig #enthält.
Gibt es auch ein Clang-basierten tool, gehören-was-Sie-verwenden, kann dies tun. gehören-was-Sie-verwenden Sie kann auch empfehlen, forward-Deklarationen (so dass Sie nicht haben, um #include, so viel) und Optional reinige deine #includes für Sie.
Aktuellen Versionen von Eclipse CDT haben auch diese Funktionalität gebaut in: unter dem Quelle-Menü und klicken auf Organisieren Beinhaltet, wird alphabetisch Ihre #enthalten ist, fügen Sie keine Kopfzeilen, Eclipse denkt, die Sie verwenden, ohne direkt einbinden und Kommentare aus alle Header, die Sie nicht denken, Sie brauchen. Dieses feature ist nicht 100% zuverlässig, aber.
Schauen Sie sich auch gehören-was-Sie-verwenden, das löst ein ähnliches problem.
Das problem mit der Erkennung überflüssig beinhaltet, ist, dass es nicht nur eine Art dependency checker. Eine überflüssige enthalten ist eine Datei, die bietet nichts von Wert, um die Zusammenstellung und nicht verändert, ein anderes Element, das andere Dateien abhängen. Es gibt viele Möglichkeiten, eine header-Datei können Sie ändern, kompilieren, also durch eine Konstante definiert wird, neu zu definieren und/oder löschen Sie ein makro, das hinzufügen eines namespace, das verändert die Suche einen Namen auf dem Weg nach unten die Linie. Um zu erkennen, Dinge wie den namespace müssen Sie viel mehr als ein Präprozessor, Sie in der Tat fast benötigen einen compiler.
Lint ist mehr ein style-checker und wird sicherlich nicht das volle Leistungsfähigkeit.
Ich glaube, Sie finden die einzige Möglichkeit zu erkennen, eine überflüssige enthalten ist, zu entfernen, kompilieren und ausführen Suiten.
Dachte ich, dass PCLint dies zu tun wäre, aber es ist schon ein paar Jahre, da habe ich es angeschaut. Könnten Sie check it out.
Schaute ich dieser blog und der Autor Sprach ein wenig über die Konfiguration PCLint zu finden, unbenutzt enthält. Könnte einen Blick Wert sein.
Den CScout refactoring-browser erkennen kann, überflüssig include-Direktiven in C (leider nicht C++) code. Finden Sie eine Beschreibung, wie es funktioniert in diese journal Artikel.
Schreiben Sie eine schnelle Skript löscht eine einzelne #include-Direktive, stellt die Projekte und protokolliert den Namen in der #include und die Datei entfernt wurde, in dem Fall, dass keine Kompilierungsfehler aufgetreten.
Laufen lassen während der Nacht, und am nächsten Tag haben Sie eine 100% korrekte Liste der include-Dateien, die Sie entfernen können.
Manchmal brute-force funktioniert einfach 🙂
edit: und manchmal nicht :-). Hier ist ein wenig information aus den Kommentaren:
Sorry für die (wieder-)post hier, die Menschen oft nicht expand Kommentare.
Check mein Kommentar zu crashmstr, FlexeLint /PC-Lint) wird dies für Sie tun. Informative Nachricht 766. Abschnitt 11.8.1 meiner Anleitung (version 8.0) erläutert das.
Auch, und das ist wichtig, halten Durchlaufen, bis die Meldung verschwindet. In anderen Worten, nach dem entfernen nicht verwendete Header, re-run lint, weitere header-Dateien möglicherweise haben sich die "nicht benötigte" sobald Sie entfernen Sie einige nicht benötigte Kopfzeilen. (Das klingt vielleicht dumm, es zu Lesen langsam & analysieren, es macht Sinn.)
Habe ich nie ein vollwertiges Werkzeug, die das leistet, was Sie gefragt haben. Die nächste Sache, die ich verwendet habe, ist IncludeManager, die Grafiken als header Eingliederung Struktur hat, so können Sie visuell Dinge entdecken, wie z.B. Kopf-im Lieferumfang enthalten in nur einer Datei und Runder Kopf-Einschlüsse.
Wenn Sie mit Eclipse CDT, können Sie versuchen,http://includator.com, der kostenlos für die beta-Tester (zum Zeitpunkt des Schreibens) und entfernt automatisch überflüssige #enthält oder fügt fehlende Zähne. Für jene Benutzer, die FlexeLint oder PC-Lint und sind mit Elicpse CDT, http://linticator.com könnte eine option sein, die (auch kostenlos für die beta-test). Während es verwendet Lint-Analyse, bietet es quick-fixes für das automatische entfernen der überflüssigen #include-Anweisungen.
Ich habe versucht, mit Flexelint (die unix-version von PC-Lint) und hatte etwas gemischte Ergebnisse. Dies ist wahrscheinlich, weil ich arbeite an einer sehr großen und schwierigen code-Basis. Ich empfehle, sorgfältig untersuchen jede Datei, die gemeldet wird, wie unbenutzt.
Die Hauptsorge ist false positives. Mehrere umfasst von den gleichen header gemeldet, als ein nicht benötigter header. Das ist schlecht, da Flexelint nicht sagen, was die Zeile der Kopfzeile enthalten ist oder wo es aufgenommen wurde, bevor.
Eine der Möglichkeiten, automatisierte tools kann verstehen das falsch:
A. hpp:
In B. hpp:
In C.cpp:
Wenn Sie blind Folgen Sie den Nachrichten von Flexelint du wirst muck up Ihre #include-Abhängigkeiten. Es gibt mehr pathologische Fälle, aber im Grunde sind Sie gehen zu müssen, überprüfen die Header selbst für die besten Ergebnisse.
Ich empfehle diesen Artikel auf Physikalische Struktur und C++ aus dem blog Spiele von innen. Sie empfehlen einen umfassenden Ansatz, um die Säuberung der #include-Chaos:
Dieser Artikel erklärt eine Technik, die von #include entfernen, mithilfe der Analyse von Doxygen. Das ist nur ein perl-Skript, so dass es sehr einfach zu bedienen.
Gibt es ein kostenloses tool Include-Datei Abhängigkeiten Watcher integriert werden kann in die visual studio. Es zeigt, überflüssig #includes in rot.
Vielleicht ein wenig spät, aber ich fand einmal einen WebKit-perl-Skript, das Tat, was Sie wollte. Es müssen einige Anpassung ich glaube (ich bin nicht bewandert in perl), aber es sollte den trick tun:
http://trac.webkit.org/browser/branches/old/safari-3-2-branch/WebKitTools/Scripts/find-extra-includes
(dies ist ein Alter Zweig, weil trunk nicht mehr die Datei)
Es gibt zwei Arten von überflüssig #include-Dateien:
das Modul(.c, .cpp) an allen
aber mehr als einmal, direkt oder indirekt.
Gibt es 2 Möglichkeiten, nach meiner Erfahrung, die gut funktioniert, um erkennen es:
gcc -H oder cl.exe /showincludes (lösen, problem 2)
In der realen Welt,
Sie können den export CFLAGS=-H vor machen,
wenn alle das Makefile nicht überschreiben
CFLAGS-Optionen. Oder wie ich Sie
erstellen einer cc/g++ - wrapper hinzufügen -H
Optionen gewaltsam zu jedem aufrufen von
$(CC) und $(CXX). und voranstellen
wrapper-Verzeichnis in $PATH
variable, dann ist dein make all
nutzt du wrapper-Befehl statt. Der
natürlich Ihre wrapper sollten aufrufen des
real gcc-compiler. Diese tricks
ändern müssen, wenn dein Makefile verwendet
gcc direkt. anstelle von $(CC) oder
$(CXX) oder durch implizite Regeln.
Können Sie auch kompilieren einer einzelnen Datei von tweaking mit der Kommandozeile. Aber wenn Sie wollen, zu reinigen Header für das gesamte Projekt. Erfassen Sie die Ausgabe von:
sauber machen
machen 2>&1 | tee result.txt
PC-Lint/FlexeLint(problem beheben
sowohl 1 und 2)
stellen Sie sicher, fügen Sie die + - e766-Optionen, diese Warnung ist über:
nicht verwendete header-Dateien.
pclint/flint -vf ...
Dadurch wird pclint Ausgabe enthalten header-Dateien, verschachtelte header-Dateien werden entsprechend eingerückt.
Zum Ende dieser Diskussion: die c++ - Präprozessor ist turing-vollständig. Es ist eine semantische Eigenschaft, ob ein zählen ist überflüssig. Daher folgt aus Reis theorem, dass es unentscheidbaren, ob eine include ist, das überflüssig ist oder nicht. Es gibt NICHT ein Programm, dass (immer korrekt) erkennt, ob ein zählen ist überflüssig.
printf
- Funktion auf während der Kompilierung, das bedeutet, dass, so kann eine hypothetische gehören analyzer. Auch gibt es keine Notwendigkeit, stark zu schaffen "GARANTIE", dass das entfernen von etwas gehören, wirken sich nicht auf alles, was unten in der Zeile (wenn Sie eine lib). In der Tat, es gibt nicht die Garantie, weil transitive beinhaltet, ist eine Sache, und die Menschen oft fälschlicherweise auf Sie verlassen. Aber in diesem Fall ist es Ihr Fehler, nicht deiner. Sie nur Dokument, die überschriften, die Sie beinhalten, genau, und sich auf alles andere ist UB (nicht Teil der öffentlichen Schnittstelle).Hier ist eine einfache brute-force-Methode zur Identifizierung von überflüssigen header enthält. Es ist nicht perfekt aber macht das "offensichtlich" unnötig umfasst. Loswerden von diesen geht ein langer Weg in die Reinigung der code.
Den Skripte kann direkt zugegriffen werden auf GitHub.
Gimpel Software PC-Lint melden können, wenn eine include-Datei wurde mehr als einmal in einer compilation unit
, aber es nicht finden können, include-Dateien, die nicht benötigt werden, in der Weise, die Sie suchen.Edit: Es können. Sehen itsmatt Antwort
CLion, die C/C++ - IDE von JetBrains, erkennt redundante umfasst out-of-the-box. Diese sind in Grau im editor, aber es gibt auch Funktionen, um die Optimierung umfasst die in der aktuellen Datei oder das ganze Projekt.
Ich habe festgestellt, dass Sie zahlen für diese Funktionalität ist aber; CLion dauert eine Weile, um zu Scannen und analysieren Ihr Projekt, wenn zum ersten mal geladen wird.