gpt4 book ai didi

c - 了解 `ctags -e` 文件格式(emacs 的 ctags)

转载 作者:太空狗 更新时间:2023-10-29 14:55:44 32 4
gpt4 key购买 nike

我正在使用“ExuberantCtags”,也称为“ctags -e”,也称为“etags”

我正在尝试了解由 etags 命令生成的 TAGS 文件格式,特别是我想了解 TAGS 文件的第 2 行。

Wikipedia says第 2 行描述如下:

{src_file},{size_of_tag_definition_data_in_bytes}

实际上,“foo.c”的 TAGS 文件第 2 行看起来像这样

foo.c,1683

我的困惑是它究竟是如何找到这个数字的:1683

我知道它是“tag_definition”的大小所以我想知道的是“标签定义”?

我试过查看 ctags source code ,但也许比我更擅长 C 的人会更成功地解决这个问题。

谢谢!

编辑#2:

^L^J
hello.c,79^J
float foo (float x) {^?foo^A3,20^J
float bar () {^?bar^A7,59^J
int main() {^?main^A11,91^J

好吧,如果我没理解错的话,“79”是指 TAGS 文件中从 79 到“91^J”之间的字节数。

很有道理。

现在这个例子中的数字 20、59、91 维基百科说是指 {byte_offset}

{byte_offset} 的偏移量是多少?

感谢肯的所有帮助!

最佳答案

是数字后换行符后面的标签数据的字节数。

编辑:它也不包含文件标签数据之间的 ^L 字符。请记住 etags 起源于很久以前,当时读取 500KB 的文件是一项昂贵的操作。 ;)

这是一个完整的标签文件。我用两种方式展示它,第一种使用控制字符 ^X 并且没有不可见字符。您的示例中隐含的行尾字符是 ^J :

^L^J
hello.cc,45^J
int main(^?5,41^J
int foo(^?9,92^J
int bar(^?13,121^J
^L^J
hello.h,15^J
#define X ^?2,1^J

这是以十六进制显示的同一文件:

0000000    0c  0a  68  65  6c  6c  6f  2e  63  63  2c  34  35  0a  69  6e
ff nl h e l l o . c c , 4 5 nl i n
0000020 74 20 6d 61 69 6e 28 7f 35 2c 34 31 0a 69 6e 74
t sp m a i n ( del 5 , 4 1 nl i n t
0000040 20 66 6f 6f 28 7f 39 2c 39 32 0a 69 6e 74 20 62
sp f o o ( del 9 , 9 2 nl i n t sp b
0000060 61 72 28 7f 31 33 2c 31 32 31 0a 0c 0a 68 65 6c
a r ( del 1 3 , 1 2 1 nl ff nl h e l
0000100 6c 6f 2e 68 2c 31 35 0a 23 64 65 66 69 6e 65 20
l o . h , 1 5 nl # d e f i n e sp
0000120 58 20 7f 32 2c 31 0a
X sp del 2 , 1 nl

本例中有两组标签数据:45字节的数据用于hello.cc,15字节的数据用于hello.h。

hello.cc 数据从“hello.cc,45^J”之后的行开始并运行 45 个字节——这也恰好是完整的行。之所以给出 bytes 是为了读取文件的代码可以只为 45 字节的字符串分配空间并读取 45 字节。 “^L^J”行在 45 个字节的标记数据之后。您可以使用它作为标记,表示还有更多文件剩余,还可以验证文件格式是否正确。

hello.h 数据从“hello.h,15^J”之后的行开始,运行 15 个字节。

关于c - 了解 `ctags -e` 文件格式(emacs 的 ctags),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1990579/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com