有时候我正在阅读一些代码并希望找到某个符号的定义,但它会在整个代码中散布到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。
答案 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)
答案 4 :(得分:0)
gcc
可输出预处理结果,所有宏定义均为gcc -E -dD
。输出文件会相当大,通常是由于嵌套的系统头。但符号的第一次出现通常是声明(定义)。输出使用#line
来显示部件预处理结果属于源/头文件,因此您可以找到它最初声明的位置。
要在编译文件时获得准确的结果,您可能需要添加用于编译文件的所有其他参数,例如-I
,-D
等。事实上,我总是复制一个结果编译命令行,并将-E -dD
添加到开头,并添加(或更改)-o
,以防我意外覆盖任何内容。
答案 5 :(得分:0)
那么你不想要的“完全成熟的IDE”是什么呢?如果它有点速度,我发现netbeans在我上学时有点有用,但真的对于力量,速度和一般效用我想推荐emacs。它有这样的关键板快捷方式。请记住,这是一个确定的学习曲线,但是一旦你越过驼峰,就不会有回头路。