2017-03-01 14 views
0

我想找出所有遞歸函數的名稱在C++項目中有很多文件。 有沒有任何IDE或腳本可以做到這一點?如何在C++項目中找到遞歸函數名稱列表

+0

對所有文件運行正則表達式應該做這個工作 – Kazz

+0

我不確定一個正則表達式會在那裏幫助... –

+0

通過遞歸你是指那些直接調用自己,或者那些通過調用鏈重新輸入的那些?因爲第一個很容易做到,第二個需要更多的工作(靜態代碼分析工具可以創建一個調用圖,您可以查看週期)。 – StoryTeller

回答

0

這不像其他人想象的那麼容易。

  1. 函數調用可以位於雙引號字符串或註釋中,因此您可能需要刪除這些函數。刪除字符串時(或者可能將其替換爲單詞0STRING),您應該搜索匹配的雙引號。請注意0​​和\"令牌。

  2. 即使刪除了所有這些,查找函數開始,結束和調用也是一項挑戰。例如,考慮模板功能。另外,如果存在宏f,f(a b){g(b);}並不是一個函數。也許你也想考慮這一點。

  3. 另外:

下面的函數是遞歸

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

而下面不是

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

大約相同的命名空間。名稱空間限定符(如類限定符)可能會使函數不遞歸。

您可能想用crange創建交叉引用鏈接表,然後用awk處理它。

0

恐怕你必須爲此編寫自己的腳本,而且這不是很簡單。您需要識別函數的開始和結束以及函數調用。那部分並不可怕。但是,您需要維護一堆嵌套函數,因此您始終知道此解析點的最內層函數。每當你找到對最內層函數的調用時,你都會報告你已經找到了遞歸。

的minorly棘手的情況是這樣的:

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

    recur = func_a() 

的第一個電話是不是遞歸的;第二個是。嵌套可以變得更深 - 你必須計算大括號以外的文字字符串 - 爲左大括號加1,爲右大括號加1,然後檢查總數爲最內層函數的「大括號嵌套」數在你的堆棧上。

這是否有助於您邁向解決方案?