是否可以通过ctags获取函数结束行号
"ctags -x --c-kinds=f filename.c"
上面的命令列出了函数定义起始行号。想要获得功能结束行号的方法。
其他方法:
awk 'NR > first && /^}$/ { print NR; exit }' first=$FIRST_LINE filename.c
这需要正确格式化代码
实施例: filename.c
1 #include<stdio.h>
2 #include<stdlib.h>
3 int main()
4 {
5 const char *name;
6
7 int a=0
8 printf("name");
9 printf("sssss: %s",name);
10
11 return 0;
12 }
13
14 void code()
15 {
16 printf("Code \n");
17 }
18
19 int code2()
20 {
21 printf("code2 \n");
22 return 1
23 }
24
输入:文件名和函数起始行号
Example:
Input: filename.c 3
Output: 12
Input : filename.c 19
Output : 23
有没有更好/更简单的方法呢?
答案 0 :(得分:4)
Universal-ctags(https://ctags.io)的C / C ++解析器有end:field。
jet@localhost tmp]$ cat -n foo.c
1 int
2 main( void )
3 {
4
5 }
6
7 int
8 bar (void)
9 {
10
11 }
12
13 struct x {
14 int y;
15 };
16
[jet@localhost tmp]$ ~/var/ctags/ctags --fields=+ne -o - --sort=no foo.c
main foo.c /^main( void )$/;" f line:2 typeref:typename:int end:5
bar foo.c /^bar (void)$/;" f line:8 typeref:typename:int end:11
x foo.c /^struct x {$/;" s line:13 file: end:15
y foo.c /^ int y;$/;" m line:14 struct:x typeref:typename:int file:
答案 1 :(得分:2)
awk
救援!
不会在注释中处理大括号,但应该处理函数内的块,请试一试...
$ awk -v s=3 'NR>=s && /{/ {c++}
NR>=s && /}/ && c && !--c {print NR; exit}' file
在指定的起始行号s后找到第一个匹配的括号。