2012-09-10 20 views
3

考慮到基於C++的源代碼,我正在尋找一種可以輸出具有/不帶接口的方法的純文本列表的工具,這意味着只有2個選項該方法的名稱或完整界面的簽名。用於檢索C++代碼庫中函數和方法列表的工具

我想將它應用到C源代碼中。

謝謝。

+1

也許有點矯枉過正,但你看看doxygen? – paddy

+0

@paddy如果輸出不是純文本,那麼使用一個工具產生一個髒輸出沒有意義,我應該使用與原始代碼基相同的正則表達式來清理它;這就像是一無所獲。 – Ken

+2

我只是提出了你是否看過它的問題,假設doxygen可能有明文輸出的選項。無論如何,處理標記文本的正則表達式規則比解析C代碼要容易得多。所以你不能真的叫一個圓圈。 – paddy

回答

2

使用Doxygen的XML格式和一個小小的python腳本來解析它,可以很容易地構建一個合理的解決方案。 Doxygens XML輸出沒有很好的記錄,但看起來相當完整。

這裏是我的Python腳本:

import lxml.etree 
import glob 

prefix = "/Code/stack_overflow_examples/list_functions_by_doxygen/" 

for filename in glob.glob("xml/*.xml"): 
    f = open(filename, "r") 
    xml = lxml.etree.parse(f) 
    for x in xml.xpath('//memberdef[@kind="function"]'): 
     srcfile = x.xpath('.//location/@file')[0].replace(prefix,'') 
     srcline = x.xpath('.//location/@line')[0] 
     definition = x.xpath('.//definition/text()')[0] 
     args = x.xpath('.//argsstring/text()')[0] 
     print("%s:%s: %s%s" % (srcfile, srcline, definition, args)) 

當這個文件運行:

/** 
* This is a test function. 
*/ 
int a_function(Baz & b) 
{ 
    return 7; 
} 

void another_function(Boo & b) 
{ 
} 

class Foo 
{ 
    private: 
    int a_private_member_function(); 
    public: 
    int a_public_member_function(); 
}; 

它生成的輸出:

test.cpp:16: int Foo::a_private_member_function() 
test.cpp:18: int Foo::a_public_member_function() 
test.cpp:5: int a_function(Baz &b) 
test.cpp:10: void another_function(Boo &b) 

你只需要一對夫婦對用於生成「文檔」的Doxyfile進行更改。 這裏是我使用的變化:

EXTRACT_ALL = YES 
EXTRACT_PRIVATE = YES 
EXTRACT_STATIC = YES 
EXTRACT_LOCAL_METHODS = YES 
EXTRACT_ANON_NSPACES = YES 
CASE_SENSE_NAMES = YES 

GENERATE_HTML = NO 
GENERATE_LATEX = NO 
GENERATE_XML = YES 
相關問題