在linux上阅读c程序时如何找到结构的定义?

Posted

技术标签:

【中文标题】在linux上阅读c程序时如何找到结构的定义?【英文标题】:How to find definition of structure when reading c program on linux? 【发布时间】:2012-03-08 20:18:57 【问题描述】:

我正在阅读xl2tpd的源代码,阅读此代码时遇到很多问题。例如,我找不到结构 lac 的定义位置。我如何找到这个结构的定义?

我已经使用 ctags 和 vim 来阅读这段代码,但没有找到结构。我用谷歌搜索并找不到结构。有没有什么方法可以让代码阅读过程更舒服?也就是说,我可以跳转到大多数变量、函数和结构的定义?

【问题讨论】:

find -name '*.h' | xargs grep -e 'struct.*lac' 【参考方案1】:

我正在使用 vim + cscope 和你有同样的问题。我找到了解决此问题的方法。

在 vim 中,搜索文本而不是定义。例如,在 linux 内核源代码中,如果您试图查找“结构文件”, 命令:

cs 查找 t 结构文件

大多数情况下你会及时得到准确的定义,注意,“struct file ”文本不要加引号。

希望对你有所帮助。

【讨论】:

【参考方案2】:

在浏览第三方代码时,我发现有一些工具非常宝贵:

Source Navigator

lxr

ctags

当然还有最古老和最伟大的:grep

我相信 Eclipse CDT 还允许您快速找到正在查看的任何变量的定义,但我没有实际使用过它 - 我更喜欢使用控制台程序进行实际的 C 编码。

这些都不是基于vim,尽管至少ctags 可以通过vimemacs 使用。不过,在探索您一无所知的新代码库时,它们可能非常有用......

【讨论】:

【参考方案3】:

用 vim 试试 cscope。请按照以下步骤操作 - 1) 在 xl2tpd 目录中运行cscope -R。它将创建文件 cscope.out 2) 使用 vim 打开文件,其中使用了结构 lac 3)使用:cs f g <lac>。现在它将显示定义 lac 的文件。 4) 选择file.h。它包含定义。 如果您对 struct lac 的定义特别感兴趣,它在下面 -

struct lac

    struct lac *next;
    struct host *lns;           /* LNS's we can connect to */
    struct schedule_entry *rsched;
    int tun_rws;                /* Receive window size (tunnel) */
    int call_rws;               /* Call rws */
    int rxspeed;                /* Tunnel rx speed */
    int txspeed;                /* Tunnel tx speed */
    int active;                 /* Is this connection in active use? */
    int hbit;                   /* Permit hidden AVP's? */
    int lbit;                   /* Use the length field? */
    int challenge;              /* Challenge authenticate the peer? */
    unsigned int localaddr;     /* Local IP address */    
    unsigned int remoteaddr;    /* Force remote address to this */
    char authname[STRLEN];      /* Who we authenticate as */
    char password[STRLEN];      /* Password to authenticate with */
    char peername[STRLEN];      /* Force peer name to this */
    char hostname[STRLEN];      /* Hostname to report */
    char entname[STRLEN];       /* Name of this entry */
    int authpeer;               /* Authenticate our peer? */
    int authself;               /* Authenticate ourselves? */
    int pap_require;            /* Require PAP auth for PPP */
    int chap_require;           /* Require CHAP auth for PPP */
    int pap_refuse;             /* Refuse PAP authentication for us */
    int chap_refuse;            /* Refuse CHAP authentication for us */
    int idle;                   /* Idle timeout in seconds */
    int autodial;               /* Try to dial immediately? */
    int defaultroute;           /* Use as default route? */
    int redial;                 /* Redial if disconnected */
    int rmax;                   /* Maximum # of consecutive redials */
    int rtries;                 /* # of tries so far */
    int rtimeout;               /* Redial every this many # of seconds */
    char pppoptfile[STRLEN];    /* File containing PPP options */
    int debug;
    struct tunnel *t;           /* Our tunnel */
    struct call *c;             /* Our call */
;

【讨论】:

cscope 比 ctags 更强大吗?它们都是索引源代码的工具吗?它们之间有什么区别? 这很有帮助!我在哪里可以找到关于 ":cs f g" vim 命令的文档?我是 vim 的新手,现在我知道如何找到定义,我正在尝试找出调用该方法的人。 没关系。在 vim 帮助页面中找到它。 ":cs" 用于 cscope 函数,"f" 是 find,"g" 是 Find 这个定义。在 vim 中输入 ":help cs" 以获取更多详细信息。 @thinke365 我个人更喜欢cscope..你可以看到更多不同hear 有一个comment 是关于如何使用一个简单的程序找到一个类型的真正定义,我对其进行了一些修改,这样我就可以在终端中将它用作任何类型的命令,我真的希望有一个列出结构真正定义的程序。【参考方案4】:

你说的是this吗?

源代码已经带有一个tags 文件。

在 Vim 中加载任何文件(在我的情况下为 common.h),您可以使用 :tag lac 跳转到 lac:tselect lac 的第一个定义,以在此项目中的 3 个出现和 :tag gconfig 之间进行选择跳转到gconfig的唯一定义。

:help tags

【讨论】:

以上是关于在linux上阅读c程序时如何找到结构的定义?的主要内容,如果未能解决你的问题,请参考以下文章

一个c语言的程序题?

Linux C程序:如何找到函数所属的库

C语言的宏定义问题

C语言的宏定义问题

c语言中define的用法

C语言中怎样修改宏定义呢