现在的位置: 首页 > 综合 > 正文

【转载】C代码阅读工具(2)—ctags

2013年09月13日 ⁄ 综合 ⁄ 共 2125字 ⁄ 字号 评论关闭

C代码阅读工具(2)---ctags

 

(2011-11-18 09:26:17)--李明华

上一周主要介绍了calltree工具,对于刚接触到源码,但不知从何下手时有一定的帮助,能帮助你对代码中的整体有一个了解。例如从main函数开始,能知道代码的大概分支,整个源码中比较重要的几个.c文件等。当对项目的整个源码有一个大概了解之后,我们需要对函数的实现细节进行分析,这样就需要对代码中部分函数体进行更细的阅读。下面我们再介绍Linux下两个源码阅读工具:

vim: Linux下编辑的工具,vim与emace被人称为程序员的倚天剑和屠龙刀,所以vim的相关网上比较多,并且大家也基本都比较清楚。

当我们单纯的使用vim进行.c文件编辑时,在一个函数中想查看该函数内部调用的一个函数实现体时,就会有些麻烦了。例如在main函数中调用了setup()函数,可是该函数并不与main函数同在一个文件中,那么使用vim寻找起来就显得相当的费劲了,下面我们介绍一个能够灵活定位函数、变量、类型、结构体的工具ctags。

 

ctags: 是一个用于生成tags文件的软件,

使用:首先进入你需要阅读的源码目录,然后使用ctags –r命令生成标签文件,-r选项与一般的shell命令一样表示递归操作,这样同时为当前目录下的子目录也生成了相应的标签文件。

每个目录下的tags文件主要包括下面这些列表:

用#define定义的宏

枚举型变量的值

函数的定义、原型和声明

名字空间(namespace)

类型定义(typedefs)

变量(包括定义和声明)

类(class)、结构(struct)、枚举类型(enum)和联合(union)

类、结构和联合中成员变量或函数

通过上面这个表可以看出,该中包含了很多calltree工具没有体现的内容。

举例:

timer   controlconf.c  /^isc_timer_t * timer;$/;" m struct:controlconnection file:

timer  include/named/client.h  /^isc_timer_t * timer;$/;" m       struct:ns_client

上面两条表示timer变量在上面两处有定义,都是isc_timer_t * timer;形式定义的。

 

gslb_find gslb.c /^gslb_find(ns_client_t *client, isc_netaddr_t *addrp, dns_name_t *name,$/;"    f

gslb_find_acl gslb.c  /^gslb_find_acl(gslb_acl_t *acls, isc_netaddr_t *reqaddr)$/;"   f      file:

上面两条表示gslb_find函数与gslb_find_acl函数在gslb.c文件中定义,函数的

下面主要讲一下怎么在vim中使用tags文件。

首先使用vim打开一个.c文件,然后就可以使用 :tag func命令定位到函数func处,使用tag命令时,也可以使用TAB键进行匹配查找以及向下切换。

:tag:例如首先vim 打开main.c文件,使用:tag gslb_find命令后,会直接定位到galb.c文件中gslb_find函数原型处。当有多处都符合时,例如:tag timer,那么显示多处匹配点提供选择。如下图:

# pri kind tag               file

1 F   m    timer             include/named/client.h

struct:ns_client

isc_timer_t *  timer;

2 FS  m    timer             controlconf.c

struct:controlconnection

isc_timer_t *   timer;

Choice number (<Enter> cancels):

 

:tnext当我们根据上面的提示选择第一个后,那么光标会定位到include/named/client.h的isc_timer_t *  timer;处,而我们在这先查看下一个匹配点时,就使用到:tnext命令了。

:tfirst 当有多个匹配时,用于定位到第一个匹配处;

:tlast  当有多个匹配时,用于定位到最后一个匹配。

:tselect tagname 与tag tagname类似,显示所有的tagname,提供给用户选择。

CTRL + ] 和CTRL + t

在一般源码阅读过程中,最简单的方法是把光标移到变量名或函数名上,然后按下“Ctrl+]”,这样就能直接跳到这个变量或函数定义的源文件中, 并把光标定位到这一行。阅读完该函数后再用“Ctrl+t”可以退回原来的地方。即使用户使用了N次“Ctrl+]”查找了N个不同的tag,按N次“Ctrl+t”也能回到最初定位的光标点,它会按原路返回。

 

附:在linux下源码阅读工具还有Cscope、Global、LXR、KScope、sourcenav等等,这里就不一一介绍了,其它这些工具我接触较少,不过以后可以尝试这些工具与tags做一个比较。

抱歉!评论已关闭.