2008-10-31 61 views
1

我需要使用python在C++文件中查找所有出現的函數調用,並提取每個調用的參數。
我打與pygccxml包,並提取給出的函數調用的字符串參數是非常容易的:使用python查找C++文件中某個函數的調用

from pygccxml.declarations import call_invocation 

def test_is_call_invocation(call): 
    if call_invocation.is_call_invocation(call): 
     print call_invocation.name(call) 
     for arg in call_invocation.args(call): 
      print " ",arg 
    else: 
     print "not a function invocation" 

什麼我無法找到是得到調用解析文件的方式:

from pygccxml import parser 
from pygccxml import declarations 

decls = parser.parse(['main.cpp']) 
# ... 

有沒有辦法找到使用pygccxml包對某個函數的調用?
或者,也許這個軟件包對於我想要做的事情來說是一種矯枉過正:)而且有一種更簡單的方法?使用正則表達式查找函數調用恐怕比第一次看到的要複雜得多......

回答

2

XML-GCC無法這樣做,因爲它只報告數據類型(和功能簽名)。它忽略了函數體。要看到,創建a.cc:

void foo() 
{} 

void bar() 
{ 
     foo(); 
} 

然後運行gccxml a.cc -fxml=a.xml。看看生成的a.xml,看看foo(或其id)的唯一提及是在foo的聲明中。

codeviz(http://www.csn.ul.ie/~mel/projects/codeviz/)中可能有替代選項。它包含一個gcc 3.4.6的補丁,它生成調用依賴信息 - 加上一些生成graphviz輸入的perl腳本;後者你可以放心地忽略。作爲另一種替代方案(不需要gcc修改),您可以複製埃及的方法(http://www.gson.org/egypt/);也可以使用egypt(http://www.gson.org/egypt/)。這解析了GCC RTL轉儲。它應該適用於任何最近的GCC,但是,這可能是因爲你沒有調用內聯函數。

在任何情況下,使用這些方法,您都不會收到對宏的「調用」,但實際上這可能是更好的選擇。

相關問題