Wie finde ich alle Aufrufer einer Funktion in C++?
Lesezeit: 5 Minuten
James Thompson
Ich überarbeite Code in C++ und möchte einige alte Methoden verwerfen. Meine aktuelle Methode zum Finden aller Methoden sieht folgendermaßen aus:
Kommentieren Sie die ursprüngliche Methode in der Quelldatei, in der ich arbeite, aus.
Versuchen Sie, den Code zu kompilieren.
Wenn ein Compilerfehler gefunden wird, machen Sie eine Notiz, kommentieren Sie den Aufruf aus und versuchen Sie, ihn neu zu kompilieren.
Nachdem die Kompilierung erfolgreich abgeschlossen wurde, habe ich alle Aufrufe gefunden.
Das ist total scheiße. Ich habe auch versucht, die Quelle für den Namen der Funktionsaufrufe zu suchen, aber ich habe manchmal Probleme mit gleichnamigen Funktionen mit unterschiedlichen Argumenten, sodass meine Kompilierung den C++-Compiler dazu bringt, die Namen für mich aufzulösen. Ich habe diese Frage für C# gefunden, aber meine Codebasis ist vollständig in C++ implementiert.
Gibt es eine bessere Möglichkeit, alle Aufrufer einer Klassenmethode oder -funktion in C++ zu finden? Ich verwende GCC auf Unix-Systemen, aber plattformübergreifende Lösungen wären der Superlativ.
Ich würde gerne von einer guten Lösung hören, aber es scheint mir, dass Sie das gesamte Frontend duplizieren müssten. Das ist so ziemlich alles, was nötig wäre, um die Symboltabelle zu erstellen.
– David Thornley
16. Juli 2009 um 21:51 Uhr
Versuchen CodeAbfrage. Es kombinierte das Beste aus cscope und ctags, um bessere Quellcodeinformationen von C++ zu erzeugen. Haftungsausschluss: Es ist mein Open-Source-Projekt.
Dies ist die richtige Antwort für mich, da ich beim Refactoring keine plattformübergreifenden Attribute benötige. Gutes Zeug!
– James Thompson
17. Juli 2009 um 6:37 Uhr
Eine nette Sache an der Attributsyntax von GCC ist, dass doppelte Eltern verwendet werden müssen; das macht es sehr einfach #ifndef __GNUC__ #define __attribute__(x) /* nothing */ #endif Stub die Attribute in anderen Compilern aus.
– vergänglich
17. Juli 2009 um 13:27 Uhr
Eclipse kann dies ohne Plugins tun. Es kann ein nützliches Werkzeug für solche Dinge sein, auch wenn Sie es nicht für Ihren täglichen Editor verwenden möchten.
Laden Sie die herunter, installieren Sie sie und führen Sie sie aus Eclipse-CDT.
Gehen Sie unter Datei, Neu, C++-Projekt. Geben Sie einen Projektnamen ein und wählen Sie ein leeres Makefile-Projekt aus der Projekttyp-Baumansicht aus. Deaktivieren Sie „Standardspeicherort verwenden“ und geben Sie den Ordner ein, in dem Ihr Projekt gespeichert ist.
Klicken Sie auf Weiter und dann auf Fertig stellen.
Eclipse beginnt automatisch mit der Indizierung Ihres Projekts. Wenn es sich wirklich um ein Makefile-Projekt handelt und Sie g++ verwenden, können Sie in Eclipse (im Menü Projekt) eine vollständige Bereinigung und dann einen Build durchführen, und es sollte automatisch Ihre vorhandenen Makefiles verwenden und Ihre Include-Verzeichnisse und andere automatisch erkennen Projekt Einstellungen.
Suchen Sie den Prototyp der überladenen Funktion in einer Quelldatei, klicken Sie mit der rechten Maustaste darauf, wählen Sie „Verweise“ und dann „Projekt“. Eclipse findet alle Verweise auf diese Funktion und nur auf diese bestimmte Überladung dieser Funktion in Ihrem Projekt.
Sie können auch die integrierte Refactoring-Unterstützung von Eclipse verwenden, um überladene Funktionen umzubenennen, sodass sie nicht mehr überladen sind. Eclipse ist auch vollständig plattformübergreifend; Sie können Funktionen wie den Indexer, Suchreferenzen und Refactoring sogar für Projekte verwenden, die in anderen IDEs verwaltet und erstellt werden.
Simultan beantwortet! Ich verlasse mich auf Ihre vollständigere Antwort und belohne Sie mit einer positiven Bewertung 🙂
– David Zitrone
16. Juli 2009 um 22:08 Uhr
Eine Möglichkeit besteht darin, Ihr gesamtes Projekt über ein Programm wie z Umfang. Dadurch wird im Wesentlichen der gesamte Quellcode Ihres Projekts analysiert und eine Datenbank erstellt, die eine einfache Suche nach Dingen wie allen Aufrufern einer Funktion, allen Referenzen usw. ermöglicht.
Ich weiß, dass es für C ziemlich gut funktioniert, und sie behaupten, dass es für C++ anständig funktioniert. KScope ist ein KDE-GUI-Frontend dafür.
Drat. Ich war hoffnungsvoll, bis ich Ihr “Sie behaupten, es funktioniert anständig für C++” las. Aufgrund deines Beitrags dachte ich, du sprichst aus eigener Erfahrung. Ich bin ein großer Fan von cscope für C-Code, sogar für großen, komplexen C-Code, aber ich hatte sehr gemischte Ergebnisse mit C++. Ich denke, anstatt zu jammern, sollte ich versuchen, cscope zu reparieren, da es schließlich auf Sourceforge ist …
– Dan
17. Juli 2009 um 0:00 Uhr
MattK
Ich denke, Sie möchten sich ein Anrufdiagramm ansehen. In dieser Frage finden Sie einige gute Vorschläge, wie Sie dies tun können.
Für alle, die dies in Visual Studio unter Windows tun möchten ….
Der visuelle Assistent ist wirklich gut. Es hilft sehr bei vielen C++-Refaktorisierungen, Call-Graphen, Umbenennungen, automatischer Erstellung von Header-Definitionen oder Generierungsmethoden aus Definitionen usw. usw. Es ist nicht perfekt, nicht vergleichbar mit der Qualität von Java/C#-Refactoring-Tools, aber wirklich gut für C++!!
Velociraptoren
Dieses Plugin für Eclipse könnte das richtige Werkzeug sein: CallGraph-Ansicht
TED
So ungefähr mache ich es. Wenn Ihr Code alles auf einmal ist, könnte ein “grep” (oder find | grep Combo) auch den Zweck erfüllen.
Eine Einschränkung: Diese Methode wird sehr oft Instanzen übersehen, die nicht bedingt in Ihre aktuelle Konfiguration kompiliert wurden. Wenn Ihr Code #ifdefs verwendet, um mehrere Konfigurationen zu unterstützen, wird eine gründliche Person versuchen, jede abzufangende Konfiguration zu kompilieren alle Instanzen.
Das ist ein wirklich guter Punkt. Glücklicherweise haben wir nicht zu viele ifdefs in unserem Code, und ich erwarte nicht viele für dieses spezielle Refactoring-Projekt, aber das ist ein weiterer Grund, warum ich einen besseren Trick brauche. 🙂
– James Thompson
16. Juli 2009 um 23:09 Uhr
11448400cookie-checkWie finde ich alle Aufrufer einer Funktion in C++?yes
Ich würde gerne von einer guten Lösung hören, aber es scheint mir, dass Sie das gesamte Frontend duplizieren müssten. Das ist so ziemlich alles, was nötig wäre, um die Symboltabelle zu erstellen.
– David Thornley
16. Juli 2009 um 21:51 Uhr
Versuchen CodeAbfrage. Es kombinierte das Beste aus cscope und ctags, um bessere Quellcodeinformationen von C++ zu erzeugen. Haftungsausschluss: Es ist mein Open-Source-Projekt.
– ruben2020
6. Juni 2013 um 14:06 Uhr