Klassenbrowsen in C ++


7

Ich arbeite mit einer großen Codebasis und finde es oft mühsam und schwer, Klassenbeziehungen zu verstehen. Ich habe das folgende Wiki gefunden , das verschiedene Tools für die Arbeit mit OOP in C ++ beschreibt, aber sie sind entweder veraltet oder funktionieren nicht! Welche Emacs-Tools stehen für die Arbeit mit großen OO-Codebasen zur Verfügung?

Folgendes habe ich gefunden:

  • Objektorientierter Browser
    • Wurde seit 2002 nicht mehr aktualisiert! Verstorben
  • Ebrowse
    • Ich kann nicht einmal einen Download-Link für den Parser finden ... mein Ziel wäre entweder Windows oder Mac OS X. Vielen Dank an @ tu-do, dass Sie darauf hingewiesen haben, dass es sich im Verzeichnis emacs bin befindet
  • Emacs Code Browser
    • Scheint nur Etags zu unterstützen, aber keine globalen Tags oder cscope

Antworten:


6

Ich schreibe einen Leitfaden für Ebrowse und werde ihn in dieser Woche veröffentlichen. Ebrowse ist ein schneller Parser, mit dem C ++ - Quelldateien verarbeitet werden, um eine Datenbank zu erstellen, die die Klassenhierarchie enthält, die später von Emacs verarbeitet wird, um eine Klassenbaumdarstellung zu erstellen. Es ähnelt etwas GNU Global, ist jedoch in Emacs integriert und erzeugt einen Klassenbaum, sodass die Verarbeitung in einem großen Quellbaum länger dauert.

So verwenden Sie Ebrowse:

find . -name '*.cpp' -or -name '*.h' | ebrowse

Fügen Sie weitere Erweiterungen hinzu, wenn Sie möchten. Wenn Ihr Projekt nur Hunderte von Dateien enthält, funktioniert = Ebrowse = sehr gut. Nach dem Ausführen des Befehls wird eine Datei mit dem Namen BROWSEgeneriert. Dies ist die Datenbank, die die Klassenhierarchie enthält. Öffnen Sie einfach diese Datei und Emacs erkennt die Datei automatisch und verarbeitet sie. Nach Abschluss der Verarbeitung der Datenbank zeigt Emacs einen Index aller Klassen in der Datenbank in einem Baumformat an: Wenn eine Klasse von einer Klasse abgeleitet ist, ist sie in der übergeordneten Klasse verschachtelt. Dieser Puffer heißt a Tree buffer. Emacs bietet drei Möglichkeiten zur Interaktion Ebrowse:

  • Tree buffer: Ein Puffer, der den Baum anzeigt.
  • Memberbuffer: Ein Puffer, der Mitglieder jeder Klasse anzeigt. Sie können zwischen Deklarationen und Definitionen einer Klasse wechseln und zum jeweiligen Speicherort in der entsprechenden Quelldatei springen.
  • SourcePuffer: Ihr Code-Puffer. Sie können mit Ebrowse Datenbanken wie dem Suchen und Anzeigen (offen für schreibgeschützte) Deklarationen und Definitionen interagieren und einen = Member = Puffer einer Klasse öffnen, die das Tag an Punkt enthält ...

Wenn Sie ein großes Projekt haben (dh mehr als 10000 cpp-Dateien), aber alle Klassen in .hDateien enthalten sind, fügen Sie keine hinzu, da das .cppGenerieren der BROWSEDatei sonst sehr lange dauern würde . Sie verlieren jedoch die Möglichkeit, zur Definition zu wechseln. Dies kann jedoch mit ctagsoder erfolgen GNU Global. Das Wichtigste ist, die Klassenhierarchie in anzuzeigen Tree buffer, und dies ist der Vorteil von Ebrowse.

Der WIP-Leitfaden ist hier .

Update : Alternativ können Sie doxygen verwenden , um alle Arten von Diagrammen zu generieren (Anrufer- / Angerufendiagramme, Abhängigkeitsdiagramme, Klassenhierarchiediagramme ...), aber es dauert auch lange, alle zu generieren, selbst für kleine Quellbäume wie ipxe . Dies ist nicht doxygenso langsam, tatsächlich ist es ziemlich optimiert, aber die Berechnung der Abhängigkeit für die gesamte Codebasis ist keine triviale Aufgabe.

Bonus : Wenn Sie mit C arbeiten und ein Anrufdiagramm anzeigen möchten, verwenden Sie GNU Cflow. Siehe meine Reddit-Antwort .


Das mag albern klingen, aber wo finde ich die ausführbare Datei "ebrowse"? Ist es nicht für Windows oder Mac OS X verfügbar?
freche

@cheezy Es wird zusammen mit Emacs installiert. Wenn Sie Emacs installieren, sollte es sich in dem binVerzeichnis befinden, das Emacs enthält. Wenn Sie also emacsin der Befehlszeile ausgeführt werden können, sollten Sie in der Lage sein, auszuführen ebrowse.
Tu Do

@cheezy übrigens, hat die Fertigstellung für Sie funktioniert?
Tu Do

+1 rein für die Org-Syntax. Oh, und ich denke, die Antwort ist auch gut :)
Sean Allred

@ SeanAllred woot hat das nicht bemerkt. Behoben :)
Tu Do

2

Sie können eine schöne Steuerungsoberfläche haben , die Sie interaktiv verwenden können cscope:

http://wikemacs.org/wiki/Python#Indexing_sources:_ctags.2C_cscope.2C_pycscope

https://github.com/sergey-pashaev/helm-cscope

Wir haben dann Funktionen wie M-x helm-cscope-find-global-definitionverfügbar. Die Navigation ist schneller.


Was er jedoch wollte, ist ein Überblick über die Klassenhierarchie, nicht die Navigation, und dies ist nur bei Ebrowse der Fall, da das einzige brauchbare Navigationswerkzeug, das er für sein Projekt hatte, etags "Tag-Vervollständigungstabelle
Tu Do

mmh, IMO (s) sucht er nicht nur nach einer Übersicht über die Klassenhierarchie (trotz des Titels), sondern auch nach "Tools [sind] für die Arbeit mit großen OO-Codebasen verfügbar". cscopehilft dabei (besser als etags) und ist das allerletzte Wort seiner Frage :)
Ehvince

Nun, in seinem vorherigen Thread hat er bereits festgestellt, dass nur etagsmit Projekten verwendet werden kann, obwohl andere Lösungen wie GNU Global ausprobiert wurden (was definitiv besser ist als ctags). Für eine Klassenhierarchie ist Eborwse oder ein externes Tool wie Doxygen jedoch eine praktikable Option. Und der allererste Satz lautet: "Ich arbeite mit einer großen Codebasis und finde es oft mühsam und schwer, Klassenbeziehungen zu verstehen " :)
Tu Do

Oh, es sieht so aus, als würden Sie sich auf einen anderen Thread beziehen (von dem ich nichts wusste). cscopehilft bei Klassenbeziehungen, weil wir "herausfinden können, wer diese Klasse anruft" und ähnliches. ok, ich bin nicht perfekt in dem Thema, aber habe immer noch meinen Platz :)
Ehvince
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.