Как найти все вызывающие функции в C ++? - PullRequest
16 голосов
/ 17 июля 2009

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

  1. Закомментируйте оригинальный метод в исходном файле, в котором я работаю.
  2. Попробуйте скомпилировать код.
  3. Если обнаружена ошибка компилятора, сделайте примечание, закомментируйте вызов и попробуйте перекомпилировать.
  4. После успешного завершения компиляции я обнаружил все вызовы.

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

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

Ответы [ 9 ]

35 голосов
/ 17 июля 2009

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)
10 голосов
/ 17 июля 2009

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

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

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

6 голосов
/ 17 июля 2009

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

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

4 голосов
/ 17 июля 2009

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

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

4 голосов
/ 17 июля 2009

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

3 голосов
/ 17 июля 2009

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

2 голосов
/ 17 июля 2009

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

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

2 голосов
/ 17 июля 2009

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

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

2 голосов
/ 17 июля 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...