方便的方法来查找变量的声明

时间:2011-11-29 15:52:59

标签: c++ c code-analysis

有时候我正在阅读一些代码并希望找到某个符号的定义,但它会在整个代码中散布到grep或多或少不足以指向我的定义。

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

Steven@Steven-PC /c/Users/Steven/Desktop/zlib-1.2.5
$ grep "FAR" * -R | wc -l
260

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

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

我可以使用哪种工具以这种方式分析代码? GCC可以帮我吗?可能clang?我最好找一些命令行。某种工具,无论如何都不是一个完整的IDE。

6 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

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

尝试:

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

答案 2 :(得分:1)

我们的Source Code Search Engine (SCSE)是一种图形grep,它根据其语言的标记(例如,C,Java,COBOL,...)索引大型代码库。查询是根据令牌而不是字符串来陈述的,因此查找标识符时不会在注释中找到它。这可以最大限度地减少误报,并且在大代码库中,这些可能会浪费很多时间。找到的点击数每行显示一个;单击将转到源文本。 可以从命令行执行查询并获得类似grep的响应。

形式的查询
 I=foo*

将查找以字母“foo”开头的任何标识符的所有用法。

查询可以组成多个令牌:

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

查找对下标foo的赋值(“...”表示“近”)。

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

D=*baz

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

虽然SCSE适用于C ++,但它目前无法在C ++中找到读/写/更新/声明。它做了其他一切。

SCSE将使用aplomb处理混合语言。 “I”查询将搜索所有具有标识符的语言,因此您可以相对轻松地查看跨语言调用,因为源和目标标识符因软件工程原因而倾向于相同。

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

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