2017-03-01 6 views
0

Ich möchte herausfinden, alle rekursiven Funktionen in einem C++ Projekt, die viele Dateien haben. Gibt es irgendwelche IDE oder Skripte können dies tun?Wie finde ich rekursive Funktion Namensliste in einem C++ Projekt

+0

run regex über alle Dateien sollte den Job tun – Kazz

+0

Ich bin mir nicht sicher, eine Regex würde da helfen ... –

+0

Mit rekursiv meinen Sie diejenigen, die sich selbst anrufen, oder auch diejenigen, die über eine Aufrufkette wieder eingegeben werden? Da der erste ziemlich einfach zu kochen ist, erfordert der zweite ziemlich viel mehr Arbeit (ein statisches Code-Analyse-Tool kann einen Aufrufgraphen erstellen, den Sie für Zyklen untersuchen können). – StoryTeller

Antwort

0

Es ist nicht so einfach wie andere vielleicht denken.

  1. Ein Funktionsaufruf kann in einer Zeichenfolge mit doppelten Anführungszeichen oder einem Kommentar enthalten sein. Sie können diese also entfernen. Wenn Sie Strings entfernen (oder sie durch das Wort 0STRING ersetzen), sollten Sie nach einem passenden doppelten Anführungszeichen suchen. Achten Sie auf \\ und \" Token.

  2. Auch nachdem Sie alle diese Funktionen entfernt haben, kann das Auffinden von Funktionsstart, -ende und -aufruf eine Herausforderung sein. Berücksichtigen Sie beispielsweise Vorlagenfunktionen. Außerdem ist f (a b) {g (b);} nicht notwendigerweise eine Funktion, wenn ein Makro f vorhanden ist. Vielleicht möchten Sie dies auch berücksichtigen.

  3. auch:

Die folgende Funktion rekursiv

class A { 
    F(int x) { 
     // ... 
     A::F(y); 
    } 
} 

während der folgenden ist nicht

class A { 
    F(int x) { 
     // ... 
     B::F(y); 
    } 
} 

Gleiche zu Namens. Namespace-Qualifikationsmerkmal, wie Klassenqualifizierer, kann die Funktion nicht-rekursiv machen oder nicht.

Sie können die Querverweisliste mit crange erstellen und dann mit awk verarbeiten.

0

Ich fürchte, dass Sie dafür ein eigenes Skript schreiben müssten, und es ist nicht ganz trivial. Sie müssen Anfang und Ende einer Funktion sowie einen Funktionsaufruf erkennen. Dieser Teil ist nicht schrecklich. Sie müssen jedoch einen Stapel verschachtelter Funktionen verwalten, damit Sie immer die innerste Funktion an diesem Analysepunkt kennen. Wenn Sie einen Aufruf für die innerste Funktion finden, melden Sie, dass Sie eine Rekursion gefunden haben.

Der minorly tricky Fall ist so etwas wie dieses:

int func_a() { 
    ... 
    int func_b() { 
     ... 
     result = func_a() 
    } 

    recur = func_a() 

Der erste Anruf nicht rekursiv ist; der zweite ist. Die Verschachtelung kann tiefer werden - Sie müssen die Klammern außerhalb der Literalzeichenfolgen zählen - 1 für eine linke Klammer hinzufügen, eine für eine rechte Klammer subtrahieren und die Summe für die "Klammerverschachtelung" -Nummer der innersten Funktion überprüfen auf deinem Stapel.

Hilft das Ihnen dabei, eine Lösung zu finden?

Verwandte Themen