2017-03-01 17 views
0

多くのファイルを持つC++プロジェクトですべての再帰関数の名前を調べたいと思います。 これを実行できるIDEまたはスクリプトはありますか?C++プロジェクトで再帰関数名リストを見つける方法

+0

正規表現を実行するとすべてのファイルが処理されます – Kazz

+0

正規表現がそこで助けになるかどうかわかりません... –

+0

再帰的には、自分自身を直接呼び出すもの、またはコールチェーンを通じて再入力されるものを意味しますか?最初は非常に簡単なので、もう1つはかなり多くの作業が必要です(スタティックコード解析ツールでは、サイクルを調べるコールグラフを作成できます)。 – StoryTeller

答えて

0

他人が考えるほど簡単ではありません。あなたはこれらを削除することもできますので、

  1. 関数呼び出しは、二重引用符で囲まれた文字列やコメントの内側にすることができます。文字列を削除するとき(または単語を0STRINGで置き換えるとき)、一致する二重引用符を検索する必要があります。 \\\"のトークンに注意してください。

  2. これらをすべて削除した後でも、関数の開始、終了、呼び出しを見つけることが難しい場合があります。たとえば、テンプレート関数を考慮してください。また、f(a b){g(b);}は、マクロfが存在する場合には必然的に関数ではありません。たぶんあなたもこれを考慮に入れたいと思うかもしれません。また

次の関数が

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

次ながら再帰的である名前空間についても同じ

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

ではありません。 Namespace修飾子は、クラス修飾子と同様に、関数を非再帰的にすることができます。

crangeで相互参照リンクテーブルを作成し、それをawkで処理したい場合があります。

0

私はこのために独自のスクリプトを書く必要があり、それほど些細なことではないと思います。関数の呼び出しと同様に、関数の開始と終了を認識する必要があります。その部分はひどいことではありません。ただし、ネストされた関数のスタックを維持する必要があるため、この解析ポイントで最も内側の関数を常に知っています。一番内側の関数への呼び出しを見つけると、あなたは再帰を発見したと報告します。

minorlyトリッキーな場合には、このようなものです:

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

    recur = func_a() 

最初の呼び出しは再帰的ではありません。 2番目はです。ネスティングがより深くなる可能性があります。をリテラル文字列のの外側に数えなければなりません - 左のブレースには1を加え、右のブレースには1を加え、最も内側の関数の "ブレースネスト"あなたのスタックに。

これはソリューションへの移行に役立ちますか?

関連する問題