5

「ctags -e」としても知られる「ExuberantCtags」を使用しています。単に「etags」としても知られています。

etags コマンドによって生成される TAGS ファイル形式を理解しようとしています。特に、TAGS ファイルの 2 行目を理解したいと考えています。

ウィキペディアによると、2行目は次のように記述されています。

{src_file},{size_of_tag_definition_data_in_bytes}

実際には、「foo.c」の TAGS ファイル line:2 は次のようになります。

foo.c,1683

私の困惑は、この番号を正確に見つける方法です:1683

「tag_definition」のサイズだとわかっているので、知りたいのは「tag_definition」とは何ですか?

私はctags のソース コードを調べてみましたが、おそらく私よりも 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} のオフセットは何ですか?

ケンを助けてくれてありがとう!

4

2 に答える 2

5

数値の後の改行に続くタグ データのバイト数です。

編集:ファイルタグデータの間に ^L 文字も含まれていません。etags は、500KB のファイルの読み取りがコストのかかる操作であった昔からあることを思い出してください。;)

これが完全なタグファイルです。私はそれを 2 つの方法で示しています。1 つ目は制御文字を ^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

同じファイルを 16 進数で表示すると、次のようになります。

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

この例には、hello.cc 用の 45 バイトのデータと hello.h 用の 15 バイトの 2 組のタグ データがあります。

hello.cc データは、"hello.cc,45^J" に続く行から始まり、45 バイトにわたって実行されます。これもたまたま完全な行です。バイトが指定されている理由は、ファイルを読み取るコードが 45 バイトの文字列用のスペースを割り当てて 45 バイトを読み取ることができるようにするためです。「^L^J」行は、45 バイトのタグ データの後にあります。これは、まだファイルが残っていることを示すマーカーとして使用し、ファイルが適切にフォーマットされていることを確認するためにも使用します。

hello.h データは、"hello.h,15^J" に続く行から始まり、15 バイト続きます。

于 2010-01-02T05:42:13.950 に答える
5

タグ エントリの {byte_offset} は、関数が定義されているファイルの先頭からのバイト数です。バイト オフセットの前の数字は行番号です。あなたの例では:

hello.c,79^J
float foo (float x) {^?foo^A3,20^J

foo 関数は、hello.c の先頭から 20 バイトで始まります。ファイル内のカーソル位置を表示するテキスト エディターで確認できます。Unix の tail コマンドを使用して、ファイルを次のバイト数で表示することもできます。

tail -c +20 hello.c
于 2010-01-02T22:43:34.277 に答える