2010-09-04 4 views
23

Gibt es irgendwelche Tools, die helfen, die #include s zu organisieren, die am Anfang einer .c oder .h Datei stehen?Gibt es Werkzeuge, die helfen, #includes zu organisieren?

Ich habe mich nur gefragt, weil ich meinen Code reorganisiere und verschiedene kleine Funktionsdefinitionen/Deklarationen aus einer langen Datei in verschiedene kleinere Dateien verschiebe. Jetzt benötigt jede der kleineren Dateien eine Teilmenge der #include s, die an der Spitze der langen Datei standen.

Es ist einfach nervig und fehleranfällig, alle #Includes von Hand herauszufinden. Oft kompiliert der Code, obwohl nicht alle #include s da sind. Beispiel: Datei A verwendet std::vector ausgiebig, aber nicht vector; aber es enthält derzeit einige obskure andere Header, die zufällig enthalten vector (vielleicht durch einige rekursive umfasst).

+0

Ich fand eine Diskussion dieses Problems auf der Eclipse CDT-Website: http://wiki.eclipse.org/CDT/C_editor_enhancements/Include_management – Frank

Antwort

1
+0

Gute Idee, aber wahrscheinlich nicht genau das, was ich brauche. Ich hätte gerne ein Tool, das mir sagt, was ich hinzufügen sollte, auch wenn ich noch kein einziges Include hinzugefügt habe (makedepend und Freunde würden in diesem Fall einen Fehler geben). Eclipse macht das für Java (vielleicht auch für C++?). Außerdem sagt mir makedepend die Abhängigkeiten für jede Kompilierungseinheit ('.o' Datei), aber nicht, was eine bestimmte Headerdatei enthalten sollte. – Frank

+3

Ich denke, das Problem, wie Sie es darstellen, ist nicht umkehrbar. Zum Beispiel kann ich ein Programm ausführen, das mir sagt, dass'EOF' in 'foo.c' nicht definiert ist. Ich kann auch mechanisch feststellen, dass EOF in 'libio.h',' stdio.h' und (z.B.) 'foo.h' definiert ist. Was nehme ich mit? – msw

+4

präsentieren Sie einen gültigen Punkt. Ein Tool könnte jedoch immer noch Vorschläge machen, basierend darauf, welche Header im Include-Pfad vorhanden sind, und vielleicht sogar welche, die Standard (oder populär) sind. –

2

VisualAssistX können Sie auf die Definition eines Typs Springen helfen. Z.B. Wenn Sie in Ihrer Quelle eine Klasse MyClass verwenden, können Sie darauf klicken, go to definition wählen, und VisualAssistX öffnet die Include-Datei, die die Definition dieser Klasse enthält (möglicherweise kann Visual Studio dies auch, aber an diesem Punkt ist es so gewöhnungsbedürftig) VisualAssistX, dass ich jede wunderbare Funktion zu VisualAssistX beisteuere :-)). Sie können dies verwenden, um die für Ihren Quellcode erforderliche Include-Datei zu finden.

PC-Lint kann genau das Gegenteil tun. Wenn Sie eine Include-Datei in Ihrer Quelle haben, die nicht verwendet wird, kann PC-Lint Sie darüber warnen, so dass Sie wissen, dass die Include-Datei aus der Quelle entfernt werden kann (was sich positiv auf Ihre Kompilierungszeit auswirken wird) .

0

Ich benutze die doxygen/dot-graphviz generierte Graphen um zu sehen, wie Dateien verknüpft sind. Sehr praktisch, aber nicht automatisch, Sie müssen die Grafiken visuell überprüfen und dann den Code bearbeiten, um unnötige "#include" Zeilen zu entfernen. Natürlich nicht wirklich geeignet für sehr große Projekte (sagen wir> 100 Dateien), wo die Graphen unbrauchbar werden.

1

Ich habe in letzter Zeit mit diesem Problem zu tun gehabt. In unserem Projekt verwenden wir C++ und für jede Klasse X. eine Xh und eine X.cpp Datei

Meine Strategie ist folgende Voraussetzungen erfüllt sein:

(1) Ist Ah, wo Klasse A deklariert wird, bezieht sich auf eine Klasse B, dann Ich muss Header Bh enthalten Wenn die Deklaration der Klasse A nur den Typ * B enthält, dann brauche ich nur eine Forward-Deklaration Klasse B; in A.h. Möglicherweise muss ich B.h in A.cpp einfügen

(2) Mit dem obigen Verfahren, verschiebe ich so viele Includes wie möglich von A.h zu A.cpp. Dann versuche ich, jeweils ein Include zu entfernen und zu sehen, ob die .cpp-Datei noch kompiliert wird. Dies sollte erlauben, die Menge der enthaltenen Dateien in der .cpp-Datei zu minimieren, aber ich bin nicht 100% sicher, ob das Ergebnis minimal ist. Ich denke auch, dass man ein Werkzeug schreiben kann, um das automatisch zu machen. Ich hatte angefangen, eins für Visual Studio zu schreiben. Ich wäre froh zu wissen, dass es solche Werkzeuge gibt.

Hinweis: vielleicht ein Hinzufügen eines richtigen Modulkonstrukts mit wohldefinierten Import/Export-Beziehungen könnte eine gewünschte Ergänzung für C++ 0x sein. Es würde die Aufgabe erleichtern, Importe viel einfacher zu reorganisieren und die Kompilierung zu beschleunigen.

1

Da diese Frage ein neues Werkzeug aufgefordert wurde, erstellt wurde: include-what-you-use, wird es auf Klirren basiert, bietet Mappings zu fälschen die Existenz bestimmter Symbole (unique_ptr in memory, aber eigentlich in bits/unique_ptr.h in einigen Standard-Header definiert und lässt Sie geben Sie Ihre eigenen Zuordnungen.

Es ist schön Diagnose und automatisches Umschreiben bietet.

1

Now each of the smaller files needs a subset of the #includes that were at the top of the long file.

ich dies mit VisualAssistX tun. Erstens, die Datei kompilieren, um zu sehen, was falsch ist singen. Dann können Sie die Add-Include-Funktion von VisualAssistX verwenden. Also gehe ich einfach mit der rechten Maustaste auf die Funktionen oder Klassen, von denen ich weiß, dass sie ein Include enthalten und klicke Add Include. Kompilieren Sie einige Male neu, um neue fehlende Includes herauszufiltern, und es ist fertig. Ich hoffe ich habe das verständlicherweise geschrieben :)

Nicht perfekt, aber schneller als von Hand.

Verwandte Themen