如何在C+中找到函数的所有调用者+;? 我在C++中重构了一些代码,我想删去一些旧的方法。我当前查找所有方法的方法如下所示: 注释掉我正在使用的源文件中的原始方法 试着编译代码 如果发现编译器错误,请在调用中添加注释并尝试重新编译 一旦编译成功完成,我就找到了所有调用

如何在C+中找到函数的所有调用者+;? 我在C++中重构了一些代码,我想删去一些旧的方法。我当前查找所有方法的方法如下所示: 注释掉我正在使用的源文件中的原始方法 试着编译代码 如果发现编译器错误,请在调用中添加注释并尝试重新编译 一旦编译成功完成,我就找到了所有调用,c++,c,refactoring,function,C++,C,Refactoring,Function,这太糟糕了。我还尝试了函数调用的名称,但是有时我会遇到不同名称的同名函数的问题,所以我的编译使C++编译器为我解析了名称。我已经找到C语言,但是我的代码库完全是用C++实现的。p> < >是否有更好的方法来找到C++中类方法或函数的所有调用方?我在Unix系统上使用GCC,但跨平台解决方案将是最好的 我就是这么做的。如果您的代码是一次性的,那么“grep”(或find | grep组合)也可能会起作用 需要注意的一点是:此方法经常会丢失未按条件编译到当前配置中的实例。如果您的代码使用#ifdef

这太糟糕了。我还尝试了函数调用的名称,但是有时我会遇到不同名称的同名函数的问题,所以我的编译使C++编译器为我解析了名称。我已经找到C语言,但是我的代码库完全是用C++实现的。p>
< >是否有更好的方法来找到C++中类方法或函数的所有调用方?我在Unix系统上使用GCC,但跨平台解决方案将是最好的

我就是这么做的。如果您的代码是一次性的,那么“grep”(或find | grep组合)也可能会起作用


需要注意的一点是:此方法经常会丢失未按条件编译到当前配置中的实例。如果您的代码使用#ifdef来支持多个配置,那么一个彻底的人将尝试使用每个配置进行编译以捕获所有实例。

GCC允许您使用修饰变量、函数和方法,这将在所有调用站点上引起警告(除非给出警告)

$g++test.c test.cc:在函数“int main()”中: test.cc:6:警告:“A::A()”已弃用(在test.cc:3声明)
我想你想要的是看一个调用图。请参阅,以获取有关如何执行此操作的一些好建议。

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


我知道它对C来说相当不错,并且他们声称它对于C++是相当有效的。是它的KDE GUI前端。

此Eclipse插件可能是正确的工具:

适用于希望在windows下的Visual Studio中执行此操作的任何人


视觉辅助真的很好。它有很多帮助,有很多C++重构、调用图、重命名、自动创建头定义或从定义等生成方法。它并不完美,没有什么像java/C++重构工具的质量,但对C++来说确实是好的!!p> Eclipse不需要任何插件就可以做到这一点。即使您不想在日常编辑器中使用它,它也可以成为处理此类内容的有用工具

  • 下载、安装并运行
  • 下文件,新建,C++项目。输入项目名称并从“项目类型”树视图中选择一个空的Makefile项目。取消选中“使用默认位置”,然后输入保存项目的文件夹
  • 单击下一步,然后单击完成
  • Eclipse将自动开始为您的项目编制索引。如果它确实是一个Makefile项目,并且由于您使用的是g++,那么您可以在Eclipse中(在“项目”菜单下)进行完全清理然后构建,并且它应该自动使用您现有的makefiles并自动发现您的include目录和其他项目设置
  • 在源文件中找到重载函数的原型,右键单击它,选择引用,然后选择项目。Eclipse将在您的项目中找到该函数的所有引用,并且只找到该函数的特定重载
  • 您还可以使用Eclipse的内置重构支持重命名重载函数,使它们不再重载。Eclipse也是完全跨平台的;甚至对于在其他IDE中维护和构建的项目,您也可以使用索引器、搜索引用和重构等功能。

    如果将索引作为源代码库,那么您应该能够查看任何函数的调用层次结构,甚至可以执行一些重构


    您可以为C/C++开发人员打开Eclipse IDE(希望您能找到特定*NIX的端口),然后按照他们的操作开始操作。

    在visual studio中,右键单击函数名,然后单击“调用浏览器”>显示调用方图形


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

    我很想听到一个好的解决方案,但在我看来,你必须复制整个前端。这几乎就是构造符号表所需要的。试试看。它结合了CCTION和CTAGS的最佳,以产生更好的C++源代码信息。免责声明:这是我的开源项目。很好。因为OQ使用的是GCC(没有提到其他平台),所以我会这么做。对于任何使用visual studio的人来说,都有类似的功能,其中#pragma deprecated(functionname)。看,这对我来说是正确的答案,因为我正在重构,我不需要跨平台的属性。好东西!GCC属性语法的一个优点是它需要使用双参数;这使得
    #ifndef uu GNUC u#define u属性u(x)/*nothing*/#endif
    在其他编译器中剔除属性变得非常容易。Simul-responsed!我尊重你更完整的答案,并奖励你一个向上投票:-)谢谢你的链接!我在搜索中没有看到这个问题。这是一个非常好的观点。幸运的是,我们的代码中没有太多的ifdef,我也不希望这个特定的重构项目有太多ifdef,但这也是我需要更好技巧的另一个原因。:)德拉特。我一直充满希望,直到我读到你的“他们声称它适合C++”。根据你的帖子,我以为你是根据第一手经验说的。我是cscope for C代码的超级粉丝,即使是大型复杂的C代码,但我的结果却参差不齐
    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)