在C中生成跨多个文件的现有函数列表

时间:2017-07-05 06:05:09

标签: c shell scripting code-analysis

由于必须填写文书工作,我需要知道整个C项目中存在多少函数。

该项目分为多个文件夹,因此理想情况下我要找的是您可以输入的内容:

FindAllTheFunctions --recursive /path/to/folder

结果写得像:

/path.../filename: int foo(float bar)
.
.
.
/path.../final/filename: double foo2(int bar2)

我怎么能得到这种性质的结果?

非常感谢!

3 个答案:

答案 0 :(得分:2)

感谢大家的所有有用评论!

最后,这就是我所做的: 我使用lst <- strsplit(words$V1, "") data.frame(char = unlist(lst), idx = sequence(lengths(lst))) # char idx #1 b 1 #2 l 2 #3 i 3 #4 b 4 #5 l 5 #6 i 6 #7 b 1 #8 l 2 #9 a 3 #10 b 4 #11 l 5 #12 a 6 #13 " 1 #14 ] 1 创建了tags文件:

ctags

这会生成一个名为ctags --recurse=yes path/to/base/of/code

的输出文件

我使用tags作为文本编辑器。所以我打开了vim文件并输入了:

tags

其中搜索文件中不以:v/f$/d 结尾的所有行并删除它们。

我剩下的是代码中的所有功能。有多少功能?

f

只有535个功能,现在我必须将它们全部记录下来......

答案 1 :(得分:2)

从评论中移动/扩展,稍微更一般的单行:

ctags -f - -R | cut -s -f 4- | grep -P '(^|\t)f($|\t)' | wc -l
  1. ctags -R以递归方式解析(...大多数...)当前目录中支持的文件; -f -将其输出重定向到stdout,而不是编写tags文件;
  2. 我们使用cut仅提取我们感兴趣的字段;

    tags文件格式由制表符分隔的字段组成(因此cut的默认分隔符已经正常);前三个字段具有固定含义且不符合我们的兴趣,而后面的字段是&#34;扩展字段&#34;,我们正在寻找单个f,表示该行指的是一个功能。

    -s仅匹配带分隔符的行(= skip garbage); -f 4-仅从第四个字段输出到最后一个字段。

  3. 我们使用grep来寻找孤独的f; &#34;扩展字段的顺序&#34;不保证 - 实际上,当通过C ++项目调用ctags时,我发现除了f之外还添加了额外的字段(特别是class:个字段)。

    -P使用PCRE正则表达式(只是因为它更容易查找制表符,egrep就足够了); (^|\t)f($|\t)查找由我们的分隔符(制表符)或行的开头/结尾包围的f;

  4. wc -l计算结果行数;结果应该是函数定义的数量。

答案 2 :(得分:0)

ctags的交叉引用功能可以帮助您。

  1. 安装Universal-ctags(https://ctags.io
  2. 运行find $ dir --name&#39; *。c&#39; | ctags --kinds-C = f -x --_ xformat =&#39;%F:%{C.properties}%t%N%S&#39;
  3. $ find ./main -name '*.c' | ./ctags --kinds-C=f -x --_xformat='%F: %{C.properties} %t %N%S' -L - | head
    ./main/args.c: extern Arguments * argNewFromArgv(char * const * const argv)
    ./main/args.c: extern Arguments * argNewFromFile(FILE * const fp)
    ./main/args.c: extern Arguments * argNewFromLineFile(FILE * const fp)
    ./main/args.c: extern Arguments * argNewFromString(const char * const string)
    ./main/args.c: extern bool argOff(const Arguments * const current)
    ./main/args.c: extern char * argItem(const Arguments * const current)
    ./main/args.c: extern void argDelete(Arguments * const current)
    ./main/args.c: extern void argForth(Arguments * const current)
    ./main/args.c: extern void argSetLineMode(Arguments * const current)
    ./main/args.c: extern void argSetWordMode(Arguments * const current)