查找变量声明的方便方法
Convenient way to find the declaration of a variable
有时我正在阅读一些代码,并希望找到某个符号的定义,但它遍布整个代码,以至于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。它有类似这样的快捷键。请记住,这是一个学习曲线,但一旦你度过了难关,就没有回头路了。
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 通过方法访问结构
- 最小硬币更换问题(自上而下方法)
- C++为构建时间获取QDateTime的可靠方法
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 当使用Lua作为嵌入式语言(比如c++)时,有什么简单/方便的方法可以找到变量在Lua中的定义位置吗
- C++/V8调用非静态函数/创建临时实例的方便方法
- 有没有一种方便的方法可以从属性树中删除节点,同时保留其子节点
- 为具有一个数字数据成员的类定义所有比较运算符的方便方法
- 有没有一种方便的方法可以让unique_ptr自动拥有像shared_ptr这样的deleter
- 有没有一种方便的方法可以通过一些Qt小部件只输入一个字符
- 用静态2d数组定义类的方便方法是什么(并且2d数组的大小只有在编译时才知道)
- 将格式化数据转换为结构的方便方法
- 在类中初始化静态向量最方便的方法是什么?
- 查找变量声明的方便方法
- 有没有一种在C++中初始化简单结构的方便方法
- 最方便的表示向量引用的向量的方法
- 方便的类型推断方法,用新对象重新分配' unique_ptr '值
- 是否有任何(方便的)方法可以在 C++11 "foreach"语句中检索当前迭代 #?