【发布时间】:2012-11-10 23:49:18
【问题描述】:
我正在寻找一种工具,它可以帮助我获取 C++ 程序中可用的所有函数以及它们可用的目录(如果是递归调用)。
例如如果在文件夹 2 所在的文件夹 1 中运行,则 foo.c 具有 int foo()
我想获取 int foo() 目录 folder2/foo.c
【问题讨论】:
-
这篇文章绝对是不离题的。这是一个非常好的,绝对与编程相关的问题。恕我直言...
我正在寻找一种工具,它可以帮助我获取 C++ 程序中可用的所有函数以及它们可用的目录(如果是递归调用)。
例如如果在文件夹 2 所在的文件夹 1 中运行,则 foo.c 具有 int foo()
我想获取 int foo() 目录 folder2/foo.c
【问题讨论】:
这是一个非常粗略的近似值,但可能已经让您更接近您正在寻找的内容,而且它的优点是非常简单。从代码库的顶级目录中,运行:
find -name "*.h" -exec grep -H '^[^/]*(' {} \;
【讨论】:
如果您安装了带有 CDT 的 Eclipse (http://www.eclipse.org/cdt/),您可以创建一个新项目,导入所有代码并进行 C/C++ 搜索。
【讨论】:
ctags 可能是你想要的。 http://ctags.sourceforge.net/
它是 vim 或 emacs 等编辑器创建标签的工具。这些编辑器可以使用标签来查找函数和类的声明和定义。
【讨论】:
我假设当您谈到您的“C++ 程序”时,您可以访问所有 C++ 源文件及其构建,例如它的Makefile 等。
如果您可以访问生成的二进制文件,则可以在其上使用nm -C 来获取其中的函数。
然后,您可能会考虑使用一些 GCC 扩展或插件。您可以使用MELT(这是一种扩展 GCC 编译器的领域特定语言)来扩展 GCC。 melt-examples/ex02 的例子在做一些非常相似的事情(它只是对函数进行计数,您可以添加几行使其输出当前计数函数的名称和源位置)。
但请注意,由于 GCC 正在优化,程序中函数的概念可能没有您想象的那么明显:GCC 是克隆和内联函数,这意味着生成的程序中的函数集不是源代码中的函数。
在 GCC 编译器中工作的优点是您可以真正获得编译器所看到的功能。例如,文本方法(如基于 ctags 或 grep 的答案)不能很好地处理预处理技巧。
【讨论】: