代码之家  ›  专栏  ›  技术社区  ›  James Thompson

如何在C++中找到函数的所有调用方?

  •  16
  • James Thompson  · 技术社区  · 16 年前

    我正在重构C++中的一些代码,我想摒弃一些旧的方法。我当前查找所有方法的方法如下:

    1. 注释掉我正在使用的源文件中的原始方法。
    2. 试着编译代码。
    3. 如果发现编译器错误,则对调用进行注释并尝试重新编译。
    4. 一旦编译成功完成,我就找到了所有调用。

    这太糟糕了。我还尝试了函数调用函数的源代码,但有时会遇到不同名称的同名函数的问题,所以我的编译使C++编译器为我解析名称。我找到了 this question 对于C++,但是我的代码库完全是用C++实现的。

    是否有更好的方法来找到C++中的类方法或函数的所有调用方?我在UNIX系统上使用gcc,但跨平台解决方案将是最高级的。

    9 回复  |  直到 16 年前
        1
  •  35
  •   ephemient    16 年前

    gcc允许您用 __attribute__((deprecated)) ,这将在所有调用站点上引起警告(除非 -Wno-deprecated-declarations 给出)。

    class A {
    public:
        A() __attribute__((deprecated)) {}
    };
    int main() {
        A a;
    }
    
    $ g++ test.c
    test.cc: In function ‘int main()’:
    test.cc:6: warning: ‘A::A()’ is deprecated (declared at test.cc:3)
    
        2
  •  10
  •   Josh Kelley    16 年前

    Eclipse可以在没有任何插件的情况下做到这一点。即使你不想在日常编辑中使用它,它也是一个有用的工具。

    1. 下载、安装并运行 Eclipse CDT .
    2. 下一个文件,新建,C++项目。输入项目名称,然后从项目类型树视图中选择一个空的makefile项目。取消选中“使用默认位置”,然后输入保存项目的文件夹。
    3. 单击下一步,然后单击完成。
    4. Eclipse将自动开始为您的项目编制索引。如果它真的是一个makefile项目,并且由于您使用的是g++,那么您可以在Eclipse中(在项目菜单下)进行完全清理然后构建,它应该自动使用现有的makefile并自动发现您的include目录和其他项目设置。
    5. 在源文件中找到重载函数的原型,右键单击它,选择引用,然后选择项目。Eclipse将在您的项目中找到对该函数的所有引用,并且只找到该函数的特定重载。

    您还可以使用Eclipse的内置重构支持来重命名重载函数,使它们不再重载。Eclipse也是完全跨平台的;您可以使用它的索引器、搜索引用和重构等特性,即使对于在其他IDE中维护和构建的项目也是如此。

        3
  •  6
  •   Falaina    16 年前

    一种选择是通过类似这样的程序运行整个项目 Cscope . 它基本上解析了项目的整个源代码,并构建了一个数据库,允许轻松搜索函数的所有调用方、所有引用等。

    我知道它对C工作相当好,并且他们声称它对于C++是相当有效的。 KScope 是它的一个KDE GUI前端。

        4
  •  4
  •   Community Mohan Dere    9 年前

    我想你想要的是看一个调用图。见 this question 关于如何做到这一点的一些好建议。

        5
  •  4
  •   Keith Nicholas    16 年前

    对于任何想在Windows下的Visual Studio中执行此操作的人…

    视觉辅助非常好。它有助于很多C++重构、调用图、重命名、自动创建标头定义或从定义等生成方法。这不是完美的,没有什么类似Java/C的重构工具的质量,但对C++确实有好处。你说什么?

        6
  •  3
  •   Velociraptors    16 年前

    Eclipse的这个插件可能是正确的工具: CallGraph View

        7
  •  2
  •   T.E.D.    16 年前

    我就是这么做的。如果您的代码都在同一个位置,那么“grep”(或find grep组合)也可以实现这一点。

    一个caviat:这个方法经常会错过没有条件地编译到当前配置中的实例。如果您的代码使用ifdefs来支持多个配置,那么一个彻底的人将尝试用要捕获的每个配置进行编译。 全部的 实例。

        8
  •  2
  •   David Citron    16 年前

    如果你让 Eclipse CDT 索引您的源库,然后您应该能够查看任何函数的调用层次结构,甚至执行一些重构。

    你可以 download C++++开发人员的Eclipse IDE(希望你能为你的特定NIX找到一个端口)并跟随它们 instructions 去吧。

        9
  •  2
  •   DShook    16 年前

    在Visual Studio中,右键单击函数名,然后单击“调用浏览器”>显示调用方关系图

    然后,在显示窗口中应该有一个名为“调用函数”的文件夹,其中包含调用该函数的所有位置,您可以双击每个位置在代码中转到它们。