周梦康 发表于 2019-09-22 446 次浏览 标签 : Vim
sudo yum -y install ctags
ctags --fields=+S -R -f ~/.vim/systags /usr/include /usr/local/include
set tags+=~/.vim/systags

但是我发现fputs函数无法跳转,搜了半天通过下面这篇文章解决了。

以下内容引用自 http://blog.chinaunix.net/uid-26495963-id-3354644.html

如果gcc正在编译c++文件,并且gcc版本大于2.8那么 __THROW会被定义为throw()。如果正在编译c文件并且gcc版本在2.8 之前,__THROW则是一个空的宏定义,如果版本大于3.3,则__THROW被定义成一个attribute内包含的nothrow的形式。最后这个形式表示这段c代码不会抛出异常。

正是这个复杂的宏定义干扰了ctags,对于所有像listen这样含有 __THROW的原型,ctags一律都不能正确解析。其原因是ctags 本身不是一个编译器也没有专门的预处理器,它是通过直接解析源文件的语法来工作的,不进行语义的检查和宏展开。对于宏,它的能力仅限于识别定义、调用和简单的条件编译的猜测。

为了不让__THROW干扰ctags,需要在运行ctags时使用-I选项。
我一般使用下面的命令生成系统头文件tags

ctags -I __THROW --file-scope=yes --langmap=c:+.h --languages=c,c++ --links=yes --c-kinds=+p --fields=+S  -R -f ~/.vim/systags /usr/include /usr/local/include

其关键是-I __THROW部分和--c-kinds=+p部分。设置-I后,ctags会在处理文件时,就会忽略-I后面写出来的符号。而--c-kinds=+p 则告诉ctags需要为函数原型的声明也生成tag。--langmap=c:+.h表示.h视为c文件而不是c++文件。

评论列表