Как найти всех вызывающих функцию в С++?

Я рефакторинг кода на С++, и я хочу отказаться от некоторых старых методов. Мой текущий метод поиска всех методов выглядит следующим образом:

  • Прокомментируйте исходный метод в исходном файле, в котором я работаю.
  • Попробуйте выполнить компиляцию кода.
  • Если ошибка компилятора найдена, сделайте примечание, чтобы прокомментировать вызов и попытаться перекомпилировать.
  • Как только компиляция завершилась успешно, я нашел все вызовы.

Это полностью отстой. Я также попробовал источник grepping для имени вызовов функций, но иногда я сталкиваюсь с проблемами с функциями с тем же именем с разными аргументами, поэтому моя компиляция позволяет компилятору С++ разрешать имена для меня. Я нашел этот вопрос для С#, но моя база кода полностью реализована на С++.

Есть ли лучший способ найти всех вызывающих метод или функцию класса в С++? Я использую GCC в Unix-системах, но кросс-платформенные решения будут превосходными.

Ответ 1

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

Eclipse может делать это без каких-либо плагинов. Это может быть полезным инструментом для таких вещей, даже если вы не хотите использовать его для ежедневного редактора.

  • Загрузите, установите и запустите Eclipse CDT.
  • Перейдите в раздел "Файл", "Новый", "Проект на С++". Введите название проекта и выберите проект "Пустой Makefile" из дерева проектов "Тип проекта". Снимите флажок "Использовать местоположение по умолчанию" и введите папку, в которой хранится ваш проект.
  • Нажмите "Далее", затем нажмите "Готово".
  • Eclipse автоматически начнет индексировать ваш проект. Если это действительно проект Makefile, и поскольку вы используете g++, вы можете сделать полную очистку, а затем построить из Eclipse (в меню Project), и он должен автоматически использовать ваши существующие make файлы и автоматически обнаруживать ваши включенные каталоги и другие настройки проекта.
  • Найдите прототип перегруженной функции в исходном файле, щелкните ее правой кнопкой мыши, выберите "Ссылки" и выберите "Проект". Eclipse найдет все ссылки на эту функцию и только на эту конкретную перегрузку этой функции в вашем проекте.

Вы также можете использовать встроенную поддержку рефакторинга Eclipse для переименования перегруженных функций, чтобы они больше не перегружались. Eclipse также полностью кросс-платформенный; вы можете использовать такие функции, как индекс, ссылки на поиск и рефакторинг даже для проектов, которые поддерживаются и создаются в других IDE.

Ответ 3

Один из вариантов - запустить весь проект через программу, например Cscope. Который по существу анализирует весь исходный код вашего проекта и создает базу данных, которая позволяет легко искать такие вещи, как все вызывающие функции, все ссылки и т.д.

Я знаю, что это хорошо работает для C, и они утверждают, что он работает прилично для С++. KScope - это интерфейс KDE GUI для него.

Ответ 4

Я думаю, что вы хотите посмотреть на график вызовов. См. этот вопрос для некоторых хороших предложений о том, как это сделать.

Ответ 5

Для тех, кто хочет сделать это в Visual Studio под окнами....

Visual Assist действительно хорош. Он много помогает во многих рефакторингах С++, графах вызовов, переименовании, автоматически создает определения заголовков или методы генерации из определений и т.д. И т.д. Он не идеален, не похож на качество инструментов рефакторинга Java/С#, но действительно хорош для С++!!

Ответ 6

Этот плагин для Eclipse может быть правильным инструментом: CallGraph View

Ответ 7

Это в значительной степени, как я это делаю. Если ваш код все в одном месте, то "grep" (или find | grep combo) тоже может сделать трюк.

Один caviat: этот метод очень часто пропускает экземпляры, которые не скомпилированы в вашу текущую конфигурацию. Если ваш код использует #ifdefs для поддержки нескольких конфигураций, тщательный человек попытается скомпилировать каждую конфигурацию, чтобы поймать все экземпляры.

Ответ 8

Если вы дадите Eclipse CDT индексировать исходную базу, то вы должны иметь возможность просматривать иерархию вызовов для любой функции и даже выполнять некоторые рефакторинг.

Вы можете download Eclipse IDE для разработчиков C/С++ (надеюсь, вы можете найти порт для вашего конкретного * NIX) и следуйте инструкциям .

Ответ 9

В визуальной студии щелкните правой кнопкой мыши по имени функции и нажмите "Вызов браузера" > Показать график звонков

Затем в окне дисплея должна быть папка "Calls to function", которая содержит все места, которые вызывают эту функцию, каждый из которых можно дважды щелкнуть, чтобы перейти к ним в коде.