5

我正在寻找一个能够提取所有函数和方法及其签名的 c++ 解析器。有这样的事情吗?

我在那里查看了 gccxml 我有一个问题,它不能使用命名空间,并且当只存在一个头文件时它不好。

4

4 回答 4

4

最明显的选择:

  1. ctags
  2. 示波器

只是 GCC 手册页的一个示例:

-fdump-noaddr -fdump-unnumbered -fdump-translation-unit[-n] -fdump-class-hierarchy[-n] -fdump-ipa-all -fdump-ipa-cgraph -fdump-ipa-inline
           -fdump-statistics -fdump-tree-all -fdump-tree-original[-n] -fdump-tree-optimized[-n] -fdump-tree-cfg -fdump-tree-vcg -fdump-tree-alias -fdump-tree-ch -fdump-tree-ssa[-n] -fdump-tree-pre[-n] -fdump-tree-ccp[-n] -fdump-tree-dce[-n]
           -fdump-tree-gimple[-raw] -fdump-tree-mudflap[-n] -fdump-tree-dom[-n] -fdump-tree-dse[-n] -fdump-tree-phiopt[-n] -fdump-tree-forwprop[-n] -fdump-tree-copyrename[-n] -fdump-tree-nrv -fdump-tree-vect -fdump-tree-sink -fdump-tree-sra[-n]
           -fdump-tree-fre[-n] -fdump-tree-vrp

还有一个gccxml 后端

于 2011-05-13T13:44:08.830 回答
1

Clang 编译器显然具有执行此操作的功能,如果我没记错的话,甚至还有一个 API 可以访问解析器生成的代码树。

于 2011-05-13T14:10:44.927 回答
1

您可以使用abi-compliance-checker-dump工具的选项来解析头文件中的函数和方法的签名:

abi-compliance-checker -lib NAME -dump DESC.xml -headers-only -stdout > api.dump

XML 描述符 ( DESC.xml) 如下:

<version>
    VERSION
</version>

<headers>
    /path(s)/to/headers/
</headers>

该工具的工作原理如下:

  1. GCC使用输入 XML 描述符中指定的标头上-fdump-translation-unit的一组自动生成的选项进行调用;-I...
  2. GCC解析由;生成的 AST 转储
  3. 以Data::Dumper或 XML 格式生成函数签名和类型定义(如果-xml提供了附加选项)。

int BZ2_bzRead ( int *bzerror, BZFILE *b, void *buf, int len )标头中函数的示例签名bzlib.h如下所示:

'228' => {
   '标题' => 'bzlib.h',
   '线' => '160',
   '参数' => {
                '0' => {
                         'algn' => '4',
                         '名称' => 'bzerror',
                         '类型' => '30'
                       },
                '1' => {
                         'algn' => '4',
                         '名称' => 'b',
                         '类型' => '16'
                       },
                '2' => {
                         'algn' => '4',
                         '名称' => 'buf',
                         '类型' => '68'
                       },
                '3' => {
                         'algn' => '4',
                         '名称' => 'len',
                         '类型' => '41'
                       }
              },
   '返回' => '41',
   'ShortName' => 'BZ2_bzRead'
 },
于 2012-01-08T13:50:15.837 回答
0

您可以尝试使用save-tempsgcc 上设置的标志编译代码,这会使 gcc 输出具有宏展开和完整签名的文件。这些是 .ii 文件。

于 2011-05-13T13:37:43.473 回答