3
考慮到基於C++的源代碼,我正在尋找一種可以輸出具有/不帶接口的方法的純文本列表的工具,這意味着只有2個選項該方法的名稱或完整界面的簽名。用於檢索C++代碼庫中函數和方法列表的工具
我想將它應用到C源代碼中。
謝謝。
考慮到基於C++的源代碼,我正在尋找一種可以輸出具有/不帶接口的方法的純文本列表的工具,這意味着只有2個選項該方法的名稱或完整界面的簽名。用於檢索C++代碼庫中函數和方法列表的工具
我想將它應用到C源代碼中。
謝謝。
使用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
也許有點矯枉過正,但你看看doxygen? – paddy
@paddy如果輸出不是純文本,那麼使用一個工具產生一個髒輸出沒有意義,我應該使用與原始代碼基相同的正則表達式來清理它;這就像是一無所獲。 – Ken
我只是提出了你是否看過它的問題,假設doxygen可能有明文輸出的選項。無論如何,處理標記文本的正則表達式規則比解析C代碼要容易得多。所以你不能真的叫一個圓圈。 – paddy