Frage

Oft finde ich, dass der Header Abschnitt einer Datei bekommen größer und größer ganze Zeit, aber es wird nie kleiner. Während der gesamten Lebensdauer einer Quelldatei Klassen verschoben haben kann und Refactoring worden, und es ist sehr gut möglich, dass es durchaus ein paar #includes, die es nicht und mehr sein müssen. Weggehen verlängern sie dort nur die Kompilierung und fügt unnötige Kompilierungsabhängigkeiten. um herauszufinden, was recht mühsam sein kann immer noch benötigt werden.

Gibt es irgendeine Art von Werkzeug, das überflüssig # include-Direktiven erkennen und deuten darauf hin, welche, die ich sicher entfernen kann?
Ist vielleicht das Flusen tun?

War es hilfreich?

Lösung

Es ist nicht automatisch, sondern doxygen werden Abhängigkeitsdiagramme für #included Dateien erzeugen. Sie werden visuell durch sie gehen haben, aber sie können für immer ein Bild von sehr nützlich sein, was, was verwendet wird.

Andere Tipps

Google cppclean (Links zu: Herunterladen Dokumentation ) mehrere Kategorien von C ++ Probleme finden können, und es kann nun überflüssig #includes finden.

Es gibt auch ein Clang-basiertes Tool, umfassen-was- Sie verwenden , dass dies tun können. include-what-you-use sogar vorwärts Erklärungen vorschlagen kann (so müssen Sie nicht so viel # include) und ggf. Ihre #includes für Sie aufzuräumen.

Aktuelle Versionen von Eclipse-CDT auch diese Funktionalität eingebaut hat: Gehen unter dem Source-Menü und klicken organisieren Enthält Ihre # include die alphabetize, fügen Sie alle Header, die Eclipse-denkt, dass Sie verwenden, ohne sie direkt darunter und Kommentare aus alle Header, die es nicht glaubt das Sie brauchen. Diese Funktion ist nicht 100% zuverlässig, aber.

Ich dachte, dass PCLint dies tun würde, aber es hat ein paar Jahre her, ich habe es sieht. Vielleicht haben Sie es überprüfen.

Ich schaute auf diesem Blog und Autor sprach ein wenig über PCLint ungenutzt enthält finden konfigurieren. Könnte einen Blick wert sein.

Der CScout Refactoring Browser überflüssig erkennen kann, gehören Richtlinien in C (leider nicht C ++) Code. Sie können eine Beschreibung wie es funktioniert in dieser Zeitschriftenartikel.

Sie können eine schnelle Skript schreiben, das eine einzelne # include-Direktive löscht, die Projekte kompiliert und protokolliert den Namen in der # include und die Datei aus in dem Fall entfernt wurde, dass keine Kompilierung Fehler aufgetreten sind.

Lassen Sie es in der Nacht laufen, und am nächsten Tag erhalten Sie einen 100% korrekte Liste haben Dateien enthalten, die Sie entfernen können.

Manchmal Brute-Force gerade arbeitet: -)


Bearbeiten und manchmal nicht :-). Hier ist ein bisschen von Informationen aus den Kommentaren:

  1. Manchmal kann man zwei Header-Dateien entfernen getrennt, aber nicht beides zusammen. Eine Lösung ist die Header-Dateien während des Laufes zu entfernen und sie nicht zurückbringen. Dies wird eine Liste der Dateien finden Sie sicher entfernen können, obwohl es könnte eine Lösung mit mehreren Dateien zu entfernen, die dieser Algorithmus nicht gefunden werden. (Es ist eine gierige Suche über den Raum von Include-Dateien zu entfernen. Es wird nur ein lokales Maximum finden)
  2. Es kann subtile Veränderungen im Verhalten, wenn Sie einige Makros neu definiert haben unterschiedlich, je nach einigen #ifdefs. Ich denke, diese sind sehr seltenen Fällen, und die Unit-Tests, die Teil des Build sind, sollten diese Änderungen fangen.

Sorry (Wieder-) hier posten, die Menschen oft Kommentare nicht erweitern.

Überprüfen Sie meinen Kommentar zu crashmstr, FlexeLint / PC-Lint wird dies für Sie tun. Informationsmeldung 766. Abschnitt 11.8.1 meiner Anleitung (Version 8.0) diskutiert dies.

Auch und das ist wichtig, Iterieren halten, bis die Meldung verschwindet . Mit anderen Worten, nach dem nicht verwendetem Header zu entfernen, wieder liefen Fusseln, mehr Header-Dateien haben „unnötige“ werden könnten, wenn Sie einige nicht benötigte Header entfernen. (Das klingt vielleicht albern, es langsam lesen und analysiert es, es macht Sinn.)

Ich habe nie ein vollwertiges Werkzeug, das vollbringt, was Sie fragen. Das nächste, was ich verwendet habe, ist IncludeManager , die Ihren Kopf Inklusion Baum Graphen, so dass Sie visuell vor Ort Dinge wie Header enthalten Einschlüsse in nur eine Datei und Rundkopf.

Wenn Sie Eclipse-CDT verwenden, können Sie versuchen, http://includator.com die für Beta-Tester ist kostenlos (bei die Zeit des Schreibens dieses Artikels) und entfernt automatisch überflüssig #includes oder fügt fehlende. Für jene Benutzer, die FlexeLint oder PC-Lint und verwenden Elicpse CDT haben, http://linticator.com könnte eine Option sein (auch für beta-Test frei). Während es Lint Analyse verwendet, bietet es schnell Korrekturen für automatisch die überflüssigen # include-Anweisungen entfernen.

Ich habe mit FlexeLint versucht (die Unix-Version von PC-Lint) und hatte etwas gemischte Ergebnisse. Dies ist wahrscheinlich, weil ich auf eine sehr große und knorrige Codebasis arbeitete. Ich empfehle, jede Datei sorgfältig untersuchen, die als nicht benutzt gemeldet wird.

Die Hauptsorge ist falsch positive Ergebnisse. Mehrere umfasst der gleichen Header werden als unnötige Header gemeldet. Das ist schlecht, da FlexeLint Ihnen nicht sagen, was die Kopfzeile auf enthalten ist oder wo es vor enthalten.

Eine der Möglichkeiten, automatisierte Werkzeuge, um diese falsch zu bekommen:

In A.hpp:

class A { 
  // ...
};

In B.hpp:

#include "A.hpp

class B {
    public:
        A foo;
};

In C.cpp:

#include "C.hpp"  

#include "B.hpp"  // <-- Unneeded, but lint reports it as needed
#include "A.hpp"  // <-- Needed, but lint reports it as unneeded

Wenn Sie blind den Nachrichten von FlexeLint folgen werden Sie Ihre # include Abhängigkeiten vermasseln. Es gibt mehr pathologische Fälle, aber im Grunde müssen Sie gehen zu den Headern selbst für die besten Ergebnisse zu überprüfen.

Ich empfehle diesen Artikel sehr auf Physikalischer und C ++ aus dem Blog Spiele von innen. Sie empfehlen, einen umfassenden Ansatz zur Reinigung des # include vermasseln:

  

Richtlinien

     

Hier ist eine destillierte Reihe von Richtlinien von Lakos’ Buch, das die Anzahl der physikalischen Abhängigkeiten zwischen Dateien minimieren. Ich habe sie seit Jahren mit und ich habe immer sehr zufrieden mit den Ergebnissen gewesen.

     
      
  1. Jede CPP-Datei enthält eine eigene Header-Datei zuerst. [Schnipp]
  2.   
  3. Eine Header-Datei muss alle Header enthalten Dateien notwendig, sie zu analysieren. [Schnipp]
  4.   
  5. Es sollte eine Header-Datei die Nötigste Anzahl der Header-Dateien notwendig, es zu analysieren. [Schnipp]
  6.   

diesem Artikel eine Technik der # include mithilfe der Analyse von Doxygen Entfernen erklärt. Das ist nur ein Perl-Skript, also ist es sehr einfach zu benutzen.

Es ist ein kostenloses Tool Include-Datei Abhängigkeiten Watcher, die in die integriert werden können Visual Studio. Es zeigt überflüssig #includes in rot.

Vielleicht ein wenig spät, aber ich fand einmal einen WebKit Perl-Skript, das nur getan, was Sie wollten. Es werde einige Adaptierungs brauchen Ich glaube (ich bin nicht gut in Perl auskennt), aber es sollte es tun:

http : //trac.webkit.org/browser/branches/old/safari-3-2-branch/WebKitTools/Scripts/find-extra-includes

(dies ist ein alter Zweig, weil Stamm mehr die Datei nicht hat)

Es gibt zwei Arten von überflüssigen # include-Dateien:

  1. Eine Header-Datei tatsächlich nicht benötigt durch das Modul (C, CPP) bei allen
  2. Eine Header-Datei wird durch das Modul benötigen aber sind enthalten mehr als einmal, direkt oder indirekt.

Da ist 2 Möglichkeiten, in meiner Erfahrung, die auf dem Erkennen es gut funktioniert:

  • gcc -H oder cl.exe / showincludes (resolve Problem 2)

    In der realen Welt, Sie können CFLAGS = -H exportieren, bevor Marke, wenn alle Makefile ist nicht außer Kraft setzen CFLAGS Optionen. Oder wie es verwendet ich, du kann erstellen Wrapper einen cc / g ++ -H hinzufügen Optionen gewaltsam zu jeder Geltendmachung von $ (CC) und $ (CXX). und stellen Sie vor der Wrapper das Verzeichnis $ PATH Variable, dann machen alle verwendet man Befehl statt Wrapper. Von Natürlich sollten Sie Ihre Wrapper aufrufen die echte gcc-Compiler. Diese Tricks müssen sich ändern, wenn Ihr Makefile Anwendungen gcc direkt. statt $ (CC) oder $ (CXX) oder implizierte Regeln.

    Sie können auch eine einzelne Datei durch Zwicken mit der Befehlszeile kompilieren. Aber wenn Sie Header für das gesamte Projekt reinigen wollen. Sie können alle Ausgaben erfassen, indem Sie:

    reinigen

    2 machen> & 1 | tee result.txt

  • PC-Lint / FlexeLint (Beschlussproblem beide 1 und 2)

    make hinzufügen sicher, dass die + e766 Optionen ist diese Warnung: nicht verwendete Header-Dateien.

    pclint / Flint -vf ...

    Diese pclint Ausgabe enthielt Header-Dateien verursachen, werden verschachtelt Header-Dateien in geeigneter Weise eingerückt werden.

Um diese Diskussion zu beenden: die c ++ Präprozessor Turing abgeschlossen ist. Es ist eine semantische Eigenschaft, ob eine Include überflüssig. Daher folgt aus Rice Satz, daß es unentscheidbar ist, ob eine Include überflüssig ist oder nicht. Es kann ein Programm nicht sein, dass (immer korrekt) erkennt, ob eine Include überflüssig.

Hier ist ein einfaches Brute-Force-Weg überflüssig Header zu identifizieren beinhaltet . Es ist nicht perfekt aber beseitigt die „offensichtlich“ unnötig enthält. Loswerden von ihnen geht ein langer Weg, den Code in säubern.

Die Skripte rel="nofollow direkt auf GitHub zugegriffen werden kann.

Gimpel Software PC Lint auf, wenn eine Include-Datei aufgenommen wurde berichtet mehr als einmal in einer Übersetzungseinheit, aber es kann Sie suchen nicht finden Dateien enthalten, die nicht in der Art und Weise benötigt werden.

Bearbeiten: Es kann. Siehe itsmatt Antwort

CLION , das C / C ++ IDE von JetBrains, redundante erkennt umfasst out-of-the -Box. Diese werden ausgegraut im Editor, aber es gibt auch Funktionen optimize enthält in der aktuellen Datei oder ganzes Projekt .

Ich habe festgestellt, dass Sie für diese Funktionalität zahlen obwohl; CLION dauert eine Weile, Ihr Projekt zu scannen und zu analysieren, wenn zuerst geladen wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top