Как найти все вызывающие стороны функции в C++?

Эти параметры из функции/метода описывают Вам значения, которые она использует для вычисления ее результата.

Эти аргументы из значений, присвоенных этим параметрам во время конкретного вызова функции/метода.

16
задан Community 23 May 2017 в 10:34
поделиться

9 ответов

GCC позволяет вам декорировать переменные, функции и методы с помощью __ attribute __ ((deprecated)) , что вызовет предупреждение на всех сайтах вызова (кроме -Wno -deprecated-declrations дано).

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)
35
ответ дан 30 November 2019 в 15:11
поделиться

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

  1. Загрузите, установите и запустите Eclipse CDT .
  2. ] Зайдите в File, New, C ++ Project. Введите имя проекта и выберите пустой проект Makefile в дереве типа проекта. Снимите флажок «Использовать расположение по умолчанию» и введите папку, в которой хранится ваш проект.
  3. Нажмите «Далее», затем нажмите «Готово».
  4. Eclipse автоматически начнет индексирование вашего проекта. Если это действительно проект Makefile, и поскольку вы используете g ++, вы можете выполнить полную очистку, а затем выполнить сборку из Eclipse (в меню «Проект»), и он должен автоматически использовать ваши существующие make-файлы и автоматически обнаруживать ваши подключаемые каталоги и другие настройки проекта.
  5. Найдите прототип перегруженной функции в исходном файле, щелкните его правой кнопкой мыши, выберите «Ссылки» и выберите «Проект». Eclipse найдет все ссылки на эту функцию и только на эту конкретную перегрузку этой функции в вашем проекте.

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

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

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

10
ответ дан 30 November 2019 в 15:11
поделиться

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

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

6
ответ дан 30 November 2019 в 15:11
поделиться

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

4
ответ дан 30 November 2019 в 15:11
поделиться

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

Visual Assist действительно хорош. Это очень помогает во многих рефакторингах C ++, графах вызовов, переименовании, автоматическом создании определений заголовков или методах генерации из определений и т.д. 114408]

4
ответ дан 30 November 2019 в 15:11
поделиться

Я так и делаю. Если ваш код находится в едином месте, то «grep» (или комбинация find | grep) тоже может помочь.

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

2
ответ дан 30 November 2019 в 15:11
поделиться

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

3
ответ дан 30 November 2019 в 15:11
поделиться

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

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

2
ответ дан 30 November 2019 в 15:11
поделиться

В Visual Studio щелкните правой кнопкой мыши имя функции и выберите «Вызов браузера» > Показать график вызывающих

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

2
ответ дан 30 November 2019 в 15:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: