如何在C++中查找函数的所有调用者?

Jam*_*son 16 c c++ refactoring function

我正在用C++重构一些代码,我想弃用一些旧的方法.我目前查找所有方法的方法如下所示:

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

这完全很糟糕.我也尝试过grepping source来获取函数调用的名称,但是我有时会遇到带有不同参数的同名函数的问题,所以我的编译让C++编译器为我解析名称.我已经为C#找到了这个问题,但我的代码库完全用C++实现.

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

eph*_*ent 35

GCC允许你用变量,函数和方法来装饰__attribute__((deprecated)),这将对所有的callite发出警告(除非-Wno-deprecated-declarations给出).

class A {
public:
    A() __attribute__((deprecated)) {}
};
int main() {
    A a;
}
Run Code Online (Sandbox Code Playgroud)
$ g++ test.c
test.cc: In function ‘int main()’:
test.cc:6: warning: ‘A::A()’ is deprecated (declared at test.cc:3)

  • 对于任何使用visual studio的人来说,#pragma deprecated(functionname)都有类似的功能.请参阅http://msdn.microsoft.com/en-us/library/044swk7y.aspx (9认同)
  • 关于GCC的属性语法的一个好处是它需要使用双重parens; 这使得`#ifndef __GNUC__ #define __attribute __(x)/*nothing*/#endif`非常容易在其他编译器中存根. (4认同)

Jos*_*ley 10

Eclipse可以在没有任何插件的情况下完成.对于像这样的东西,它可以是一个有用的工具,即使你不想将它用于你的日常编辑器.

  1. 下载,安装和运行Eclipse CDT.
  2. 转到File,New,C++ Project下.输入项目名称,然后从"项目类型"树视图中选择"空Makefile"项目.取消选中"使用默认位置",然后输入保存项目的文件夹.
  3. 单击Next,然后单击Finish.
  4. Eclipse将自动开始为您的项目编制索引.如果它确实是一个Makefile项目,并且因为你正在使用g ++,你可以完全清理然后在Eclipse中构建(在Project菜单下),它应该自动使用你现有的makefile并自动发现你的include目录和其他项目设置.
  5. 在源文件中找到重载函数的原型,右键单击它,选择"引用",然后选择"项目".Eclipse将在项目中找到对该函数的所有引用,并且仅查找该函数的特定重载.

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


Fal*_*ina 6

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

我知道它对C来说效果很好,并且他们声称它适用于C++.KScope是它的KDE GUI前端.

  • 讨厌鬼.我很有希望,直到我读到你的"他们声称它适用于C++".根据你的帖子,我以为你是从第一手经验讲的.我非常喜欢cscope的C代码,甚至是大而复杂的C代码,但我对C++的结果非常复杂.我想而不是感叹我应该尝试修复cscope,因为它毕竟是源于Sourceforge ...... (2认同)