我克隆了鲜牛肝菌 (git://git.savannah.gnu.org/gnulib.git,Last : 23.03.2017),并通过ctags (ExuberantC5.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没有识别这个特定的函数呢?
发布于 2017-04-12 17:56:12
要捕获声明,请使用--C--种类=+p选项。
[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发布于 2017-03-27 00:00:07
ctags可以看到声明,但是可以有很多声明。但是它没有看到任何定义,因为真正的定义看起来像C函数full_rw: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++预处理功能(只有几个带有-I选项的预处理试探,记录在http://ctags.sourceforge.net/ctags.html中)。因此ctags无法意识到full_rw函数定义定义了其他一些东西,即full_write函数。有ctags文档的部分
注意事项 因为ctag既不是预处理器,也不是编译器,所以使用预处理器宏可以愚弄ctag,使其丢失标记或不适当地生成不适当的标记。虽然ctag被设计用来处理某些常见的情况,但这是报告问题的最大原因。特别是,使用改变C的文本语法的预处理结构可以欺骗ctag。您可以使用−I选项来解决许多这样的问题。
https://stackoverflow.com/questions/43035737
复制相似问题