查找变量声明的方便方法

Convenient way to find the declaration of a variable

本文关键字:方便 方法 声明 变量 查找      更新时间:2023-10-16

有时我正在阅读一些代码,并希望找到某个符号的定义,但它遍布整个代码,以至于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。

您可能想要检查cscope,它基本上是为此制作的,并且是一个命令行工具(如果您喜欢,可以使用ncurses)。同样,libclang (clang/llvm的一部分)可以做到这一点-但这只是一个库(但我只花了大约100行python来使用libclang来模拟基本的cscope功能)。

cscope要求您首先构建一个数据库。Libclang可以实时解析代码

如果变量没有在当前文件中声明,它将在包含的文件中声明,即.h。因此,您可以通过仅对这些文件执行grep来限制数据量。

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

试题:

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

我们的源代码搜索引擎(SCSE)是一种图形化的grep,它根据其语言(例如,C, Java, COBOL,…)的标记对大型代码库进行索引。查询是根据令牌而不是字符串来声明的,因此查找标识符不会在注释中间找到它。这将最大限度地减少误报,而在大型代码库中,这可能会严重浪费时间。每行显示一个找到的点击;单击将转到源文本。您也可以从命令行执行查询,并获得类似grep的响应。

格式为

的查询
 I=foo*

将查找以字母"foo"开头的任何标识符的所有使用。

查询可以包含多个令牌:

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

查找对下标foo的赋值("…"表示"near")。

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

D=*baz

查找名称以"baz"结尾的变量声明。我想这就是OP要找的。

虽然SCSE适用于c++,但它目前无法在c++中找到读/写/更新/声明。它做其他的事情。

SCSE将从容地处理混合语言。"I"查询将搜索所有具有标识符的语言,因此您可以相对容易地看到跨语言调用,因为出于软件工程原因,源标识符和目标标识符往往是相同的。

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

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

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

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

那么你为什么不想要一个"成熟的IDE"呢?如果是速度方面的问题,我在上学的时候就发现netbeans有些用处,但从功能、速度和一般用途上来说,我推荐使用emacs。它有类似这样的快捷键。请记住,这是一个学习曲线,但一旦你度过了难关,就没有回头路了。