2011-11-29 92 views
3

有时候我正在阅读一些代码,并希望找到某个符号的定义,但它会散布在整个代码中,以至于grep或多或少不足以指向我对它的定义。查找变量声明的便捷方法

例如,我正在与Zlib合作,我想弄清楚FAR的含义。

[email protected] /c/Users/Steven/Desktop/zlib-1.2.5 
$ grep "FAR" * -R | wc -l 
260 

这是很多需要扫描。事实证明,这实际上是#defineð,但它花了我一些时间来弄明白。

如果我使用的是Eclipse,我会很容易,因为我可以将鼠标悬停在符号上,它会告诉我它是什么。

我可以用这种方式分析代码中的哪些工具? GCC能为我做这个吗? clang也许?我正在寻找一些命令行。无论如何,某种工具不是完整的IDE。

回答

1

您可能想要查看cscope,它基本上是为此而设计的,并且是一个命令行工具(如果您喜欢,请使用ncurses)。另外,libclang(clang/llvm的一部分)可以这样做 - 但这只是一个库(但是我只需要100行python来使用libclang来模拟基本的cscope功能)。

cscope要求您先建立数据库。 libclang可以解析代码“live”。

0

gccxml,但我不知道建立在它之上的工具。铛和LLVM也适合这样的东西;同样,我不知道建立在它们上面的独立工具。

除此之外:QtCreator和code :: blocks也可以找到声明。

1

如果该变量未在您的curernt文件中声明,则会在包含文件中声明该变量,即.h。所以你可以通过仅对这些文件执行grep来限制数据量。

此外,您可以使用grep的-w选项过滤整个单词匹配项。

尝试:

grep -w "FAR" *.h -R | wc -l 
+0

该符号还可能首次在包含在.h文件中的文件中声明,等等......所以您的方法有时会失败。 –

1

我们Source Code Search Engine (SCSE)是一种图形的grep该索引根据其语言(S)的令牌的大的代码基础(例如,C,Java和COBOL,...)。查询是用符号来表示的,而不是字符串,所以查找标识符不会在评论中找到它。这最大限度地减少了误报,并且在大规模的代码基础中,这可能是严重浪费时间。找到的匹配每行显示一个;点击进入源文本。 可以从命令行执行查询并获得类似grep的响应。

I=foo* 

形式的查询就会发现,以字母为“foo”开头的标识符的所有用途。

查询可以撰写mulitiple令牌:

I=foo* '[' ... ']' '=' 

发现分配到一个下标FOO( “...” 表示 “接近”)。

对于C,Java和COBOL,SCSE可以查找变量的读取,写入,更新和声明。

D=*baz 

查找名称以“baz”结尾的变量的声明。我认为这是OP正在寻找的。

尽管SCSE适用于C++,但它目前在C++中找不到读/写/更新/声明。它做了其他事情。

SCSE将处理混合语言并具有沉默。一个“I”查询将跨越所有具有标识符的语言进行搜索,所以您可以相对容易地看到跨语言调用,因为源和目标标识符往往因软件工程原因而相同。

0

gcc可以输出预处理结果,其中所有宏定义为gcc -E -dD。输出文件会比较大,通常是由于嵌套的系统标题。但符号的首次出现通常是声明(定义)。输出使用#line来显示部分预处理结果属于源/头文件,因此您可以找到它最初声明的位置。

要获得文件编译时的确切结果,您可能需要添加用于编译文件的所有其他参数,例如-I,-D等。实际上,我总是复制结果编译命令行,并添加-E -dD开始,并添加(或更改)-o以防我意外覆盖任何内容。

0

那么你不想要什么“完全成熟的IDE”呢?如果它有一点速度,我发现netbeans在我上学的时候有点用处,但是真正的力量和速度以及一般效用我想推荐emacs。它有这样的关键板快捷键。请记住,它的学习曲线是可以肯定的,但是一旦你过了驼峰,就没有回头路了。

+0

emacs是否实际上处理语言以确定符号的声明位置? –

+0

下面是一些链接,可能会帮助你什么emacs能够:[链接](http://stackoverflow.com/questions/2790065/emacs-is-there-a-semantic-jump-to-declaration-using- semantic-el),[链接](http://deep.syminet.com/emacside.html) – Irony