您的位置:首页 > 运维架构 > Linux

Linux下源码分析利器Ctags

2016-05-03 23:16 288 查看
最近有看一些代码量比较大的开源代码,在阅读的过程中感觉读大型的源码真的好难。我们先不说其逻辑方面的难度,而是你在读的过程中所遇到的大量的宏定义,类型定义,函数定义以及一些枚举变量等把我们搞的是晕头转向,因为我们得到其他文件里找到他们的原始定义,这真是最令人头疼的地方。此时你是否会想要是有一个程序能自动帮我们找到上述东西的原始定义那该多好。其实linux下就有这个工具ctags

1.Ctags的安装

方法1:

sudo apt-get install ctags


方法2:

安装包下载地址http://ctags.sourceforge.net

压缩包下载好之后执行如下操作

./configure
make
sudo make install


2.ctags的对象列表

ctags的对象列表其实就是说ctags能帮我们寻找程序中的哪些对象的实现或是定义

(1)#define定义的宏

(2)枚举变量的值

(3)函数的实现

(4)类型定义

(5)变量定义和声明

(6)类,结构体等

3.使用前的准备

首先我在我的ubuntu上创建一个src目录,之后我的所有操作都会是以在此目录下为前提了

我写了如下3个测试文件

test.h

#pragma once

#define VALUE_ZERO 1

enum VALUE
{
VALUE_ONE,
VALUE_TWO,
VALUE_THREE
};

void printHello(void);

typedef int INT;

class Test
{
public:
Test(int v);
int get(void);
private:
int value;
};


test.cpp

#include "test.h"
#include <stdio.h>

int value = 10;

void printHello(void)
{
printf("hello\n");
}

Test::Test(int v)
:value(v)
{
;
}

int Test::get(void)
{
return value;
}


main.cpp

#include "test.h"

#include <stdio.h>

extern int value;

int main(void)
{
printf("%d\t%d\t%d\n",VALUE_ZERO,VALUE::VALUE_ONE,VALUE_TWO);

printHello();

INT n = 5;
printf("%d\n",n);

printf("%d\n",value);

Test test(3);
printf("%d\n",test.get());
}


接下来我们就要已main.cpp来为大家展示ctags的好用

要想使用ctags分析源码,那么我们就得先用如下命令来生成对该源码所有文件中的对象列表中的对象和其对应定义或实现所在文件的地点的索引

命令如下

ctags -R


需要强调的是此目录要在src目录下执行

执行此命令后我们ls结果如下



可以看出生成了新文件ctags,我们打开查看一下它里面的内容



从图中可以看出它采用某种方式对那些关键对象的定义或实现的位置做了记录

4.开始使用

在此之前有一点要补充的是ctags这个工具和我们的vim是配合使用的

首先打开main.cpp文件



假设我们要查看VALUE_ZERO该宏的定义,只需要将当前终端的光标移动到该宏的位置处,如下图所示



然后ctrl+]就可以切到其原始定义的文件处了



此时我们如果想回到之前位置只需要ctrl+t就可以了

接着你又想查看printHello这个函数体是咋样写的,那么还是老方法,首先把光标放到该函数处,接着crtl+],执行结果如下



同样想回到之前文件处crtl+t

其它的只要是我们前文中对象列表里有的对象,都可以采用这种方法来查看其对应的原始定义或实现
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息