由于必须填写文书工作,我需要知道整个C项目中存在多少函数。
该项目分为多个文件夹,因此理想情况下我要找的是您可以输入的内容:
FindAllTheFunctions --recursive /path/to/folder
结果写得像:
/path.../filename: int foo(float bar)
.
.
.
/path.../final/filename: double foo2(int bar2)
我怎么能得到这种性质的结果?
非常感谢!
答案 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
ctags -R
以递归方式解析(...大多数...)当前目录中支持的文件; -f -
将其输出重定向到stdout,而不是编写tags
文件; 我们使用cut
仅提取我们感兴趣的字段;
tags
文件格式由制表符分隔的字段组成(因此cut
的默认分隔符已经正常);前三个字段具有固定含义且不符合我们的兴趣,而后面的字段是&#34;扩展字段&#34;,我们正在寻找单个f
,表示该行指的是一个功能。
-s
仅匹配带分隔符的行(= skip garbage); -f 4-
仅从第四个字段输出到最后一个字段。
我们使用grep
来寻找孤独的f
; &#34;扩展字段的顺序&#34;不保证 - 实际上,当通过C ++项目调用ctags
时,我发现除了f
之外还添加了额外的字段(特别是class:
个字段)。
-P
使用PCRE正则表达式(只是因为它更容易查找制表符,egrep
就足够了); (^|\t)f($|\t)
查找由我们的分隔符(制表符)或行的开头/结尾包围的f
;
wc -l
计算结果行数;结果应该是函数定义的数量。
答案 2 :(得分:0)
ctags的交叉引用功能可以帮助您。
$ 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)