Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于检索C+中函数和方法列表的工具+;代码库 P> >考虑基于C++的源代码,我正在寻找一种工具,它可以输出带有/不带接口的纯文本列表方法,这意味着2个选项,只有方法的名称或完整的接口的签名。_C++_List_Methods - Fatal编程技术网

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

用于检索C+中函数和方法列表的工具+;代码库 P> >考虑基于C++的源代码,我正在寻找一种工具,它可以输出带有/不带接口的纯文本列表方法,这意味着2个选项,只有方法的名称或完整的接口的签名。,c++,list,methods,C++,List,Methods,我也希望将此应用于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/*.xm

我也希望将此应用于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

根据Jonathan Wakely的评论,你可以这样使用:

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
    -强制输出指定的标记文件格式

可能有点过火,但你看过doxygen吗?@paddy如果输出不是纯文本,那么使用工具来清理脏输出是没有意义的,我应该使用与原始代码库相同的正则表达式规则来清理脏输出;我只是提出了一个问题,你是否看过它,假设doxygen可能有一个纯文本输出选项。无论如何,处理标记文本的正则表达式规则要比解析C代码的正则表达式规则简单得多。所以,你不能真的称为圆。@,一个正则表达式,例如,解析输出的数量级将比一个完整的C++解析器容易,从任意复杂的C++源代码中提取成员函数声明符。因为需要更多的努力而放弃部分解决方案是非常短视的。@JonathanWakely使用ctagsGood solution:)演示您的示例,如果提供一些解释,可能会更有帮助。当我将这些命令放在macOS上时,输出只是“非法选项”。