6

考虑到基于 C++ 的源代码,我正在寻找一种可以输出带有/不带有接口的纯文本方法列表的工具,这意味着 2 个选项,只有方法的名称或完整的接口签名。

我也想将其应用于 C 中的源代码。

谢谢。

4

2 回答 2

4

使用 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
于 2012-09-11T07:17:12.537 回答
4

根据 Jonathan Wakely 的评论,您可以像这样使用ctags

ctags -x --c-types=f --format=1 file.c

它将列出您的功能:

celsjusz2Fahrenheit   17 file.c double celsjusz2Fahrenheit(double celsjuszDegree)
celsjusz2Kelwin    21 file.c double celsjusz2Kelwin(double celsjuszDegree)
main               44 file.c int main()

如果要列出按类名处理的方法,可以使用:

ctags -x --c++-types=f --extra=q --format=1 file.cc

它将打印例如:

S::f                9 file.cc void f()
S::f1              11 file.cc void f1()
S::f2              13 file.cc void f2()
celsjusz2Fahrenheit   17 file.cc double celsjusz2Fahrenheit(double celsjuszDegree)
celsjusz2Kelwin    21 file.cc double celsjusz2Kelwin(double celsjuszDegree)

编辑(由于评论): Args 意味着(复制自ctags --help):

  • -x- 将表格交叉引用文件打印到标准输出。
  • --extra=q- 添加额外的标志,其中q的意思是“为每个标签包括一个额外的类限定标签条目”
  • --format=1- 强制输出指定的标签文件格式
于 2018-10-03T08:33:14.840 回答