我克隆了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
识别出这个特殊的功能?
答案 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选项解决许多此类问题。