在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
可以通过vim
或emacs
使用。不过,在探索您一无所知的新代码库时,它们可能非常有用......
【讨论】:
【参考方案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程序时如何找到结构的定义?的主要内容,如果未能解决你的问题,请参考以下文章