【问题标题】:Who calls this function?谁调用这个函数?
【发布时间】:2009-02-12 18:43:17
【问题描述】:

在我的上一份工作(遗留 FORTRAN 77 代码)中,我们有交叉引用文件,其中列出了哪些子例程称为其他子例程、在哪些文件中定义了子例程、哪些公共块包含哪些变量、哪些子例程包含哪些公共块等. 然后,这些被用于 grep 交叉引用文件的 shell 脚本使用,并会告诉您有关程序设计的信息。

我现在在一家新公司工作(C++ 代码),我找到了 ctags 来替换其中的一些功能。我最想念的一件事是我们称为“who.calls”的命令,它列出了哪些子例程(我的意思是函数或方法,必须习惯于 OO 语言)调用给定的子例程。例如,如果子程序foo调用子程序bar

>who.calls bar
foo

关于如何在不重新设计旧公司的编程环境的情况下做到这一点的任何建议?我正在寻找可以在命令行中使用的超级正则表达式或其他方法,但我对其他方法持开放态度,这些方法采用完全不同的方法为我提供相同的信息。我基本上想在不运行调试器的情况下发现一个调试函数堆栈。

【问题讨论】:

    标签: shell ctags code-search-engine


    【解决方案1】:

    您可能需要考虑使用doxygen。它可以生成向您显示整个调用树和类结构的网页,以及提取格式正确的 cmets 来记录类和方法,就像 Javadocs 为 java 所做的那样。

    另一种可能性是开始使用 IDE。在使用 vi(然后是 gvim)和 ctags 25 年后,我最近加入了 21 世纪并开始使用 Eclipse(我正在做 Java,但我已经看到了 Eclipse 的 C++ 插件)。除了能够做标签可以做的所有事情,它还可以将您带到当前方法的所有调用者。最重要的是,它内置了一个非常棒的交互式调试器。

    【讨论】:

    • 感谢@J.F 的编辑 - 我给了你一个 +1 的投票,你有 9 票,让你获得徽章。
    【解决方案2】:

    对于命令行使用,试试cscope;它应该能够回答这个问题等等:

    • 允许搜索代码:
      • 对符号的所有引用
      • 全局定义
      • 函数调用的函数
      • 函数调用函数
      • 文本字符串
      • 正则表达式模式
      • 一个文件
      • 文件包括文件

    它不是为 C++ 编写的,但可以处理搜索 C++ 代码库(使用some caveats)。

    如果您正在寻找基于 Web 的界面,请考虑OpenGrok,它在服务器上运行并为您的修订控制系统编制索引。它没有您正在寻找的特定搜索,但它可以通过符号搜索来近似它。

    【讨论】:

      【解决方案3】:

      SlickEdit 可以标记项目中的每个符号,包括库,以在“显示引用”中显示。它将是 who.calls 加一,其中加一是定义。它是基于源的。

      【讨论】:

        【解决方案4】:

        GNU Global 在基于 Unix 的系统上为我完成了这项工作。

        【讨论】:

        • 你会输入什么来获得 who.calls 功能?我认为这已经接近我想要的了。
        • 这告诉我哪些文件包含函数调用。我想知道那些文件中调用我的函数的函数的名称。
        • 他们有一个带有 Linux 内核代码的网络演示 - 您可以单击函数声明,它会将您带到调用者。
        • export LESSGLOBALTAGS=global less -t functionname 它既做引用也做函数定义的地方。以上是函数定义,但也有引用。阅读教程。
        【解决方案5】:

        可以找到对语言敏感的源代码搜索引擎 在SD Source Code Search Engine。它可以同时处理多种语言。 可以搜索特定语言的模式, 或跨语言的模式(例如“查找涉及 TAX 的标识符”)。 通过对语言标记敏感,可以减少误报的数量, 为用户节省时间。它理解 C、C++、C#、COBOL、Java、ECMAScript、Java、XML、Verilog、VHDL 和许多其他语言,特别是 FORTRAN。

        用这个工具很容易找到在 Fortran 中调用 X 的人;简单地搜索所有 标识符“X”。您输入的实际查询是这样的: 我=X (“任何名为 X 的标识符”)。这会找到整个源代码库中的所有引用。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-10-08
          • 1970-01-01
          • 2017-07-14
          • 2012-02-27
          • 1970-01-01
          相关资源
          最近更新 更多