ctags没有找到一个功能

时间:2017-03-26 23:19:15

标签: c ctags

我克隆了fresh gnulib(git://git.savannah.gnu.org/gnulib.git,最后更改:23.03.2017)并按ctags索引了所有文件( Exuberant Ctags 5.9〜svn20110310 ):

ctags -R gnulib

令人惊讶的是,我没有找到grep的full_write函数的任何标记(我特别感兴趣的是这个函数)

grep full_write tags

但是此函数在gnulib/lib/full-write.h

中声明
extern size_t full_write (int fd, const void *buf, size_t count);

以及在gnulib/lib/full-write.c

中重新定义
# define full_rw full_write

所以我真的很困惑:为什么没有ctags识别出这个特殊的功能?

2 个答案:

答案 0 :(得分:2)

要捕获声明,请使用--C - types = + p option。

[jet@localhost ~]$ git clone git://git.savannah.gnu.org/gnulib.git

Cloning into 'gnulib'...
remote: Counting objects: 174685, done.        
remote: Compressing objects: 100% (24750/24750), done.        
remote: Total 174685 (delta 149911), reused 174636 (delta 149876)        
Receiving objects: 100% (174685/174685), 33.95 MiB | 3.97 MiB/s, done.
Resolving deltas: 100% (149911/149911), done.
Checking connectivity... done.
[jet@localhost gnulib]$ ctags --C-kinds=+p -R
[jet@localhost gnulib]$ grep  full_write tags
full_write  lib/full-write.h    /^extern size_t full_write (int fd, const void *buf, size_t count);$/;" p

答案 1 :(得分:1)

ctags看到声明,但可以有很多声明。但它看不到定义,因为真正的定义看起来像名为full_rw的C函数的定义: http://git.savannah.gnu.org/cgit/gnulib.git/tree/lib/full-write.c?id=683b6078961f10905baba598c469402ed0133425#n51

#ifdef FULL_READ
..
# define full_rw full_read
#else
...
# define full_rw full_write
#endif
size_t
full_rw (int fd, const void *buf, size_t count)

ctags没有完整的c预处理功能(http://ctags.sourceforge.net/ctags.html中记录了-I选项的几个预处理启发式算法。因此ctags无法意识到此full_rw函数定义定义了其他内容full_write函数。有ctags documentation部分:

  

CAVEATS

     

因为ctags既不是预处理器也不是编译器,因此使用   预处理器宏可以将ctags伪装成缺少的标签或   不正确地生成不适当的标签。虽然ctags已经   旨在处理某些常见情况,这是最大的一个   报告问题的原因。特别是使用预处理器   改变C的文本语法的构造可以欺骗ctags。您可以   通过使用-I选项解决许多此类问题。