Кто вызывает эту функцию? - PullRequest
3 голосов
/ 12 февраля 2009

На моей последней работе (устаревший код FORTRAN 77) у нас были файлы перекрестных ссылок, в которых перечисляется то, что подпрограммы называют другими подпрограммами, в каких файлах были определены подпрограммы, какие общие блоки содержат какие переменные, какие подпрограммы включают какие общие блоки и т. Д. Затем они использовались сценариями оболочки, которые обрезали файлы перекрестных ссылок и рассказывали вам о дизайне программы.

Я сейчас в новой компании (код C ++), и я нашел ctags, чтобы заменить некоторые из этих функций. Больше всего я скучаю по команде, которую мы назвали "who.calls", которая перечисляет то, что подпрограммы (я имею в виду функции или методы, которые должны привыкнуть к говорению на ОО) вызывают данную подпрограмму. Например, если подпрограмма foo вызывает подпрограмму bar:

>who.calls bar
foo

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

Ответы [ 5 ]

5 голосов
/ 12 февраля 2009

Возможно, вы захотите использовать doxygen . Он может создавать веб-страницы, на которых отображается все дерево вызовов и структура классов, а также извлекать правильно отформатированные комментарии для документирования классов и методов, как это делают Javadoc для java.

Другая возможность - начать использовать IDE. После 25 лет использования vi (а затем и gvim) и ctags я недавно присоединился к 21-му веку и начал использовать Eclipse (я занимаюсь Java, но я видел плагины C ++ для Eclipse). Наряду с возможностью делать все, что могут делать теги, он также может перенаправить вас на все вызовы текущего метода. И вдобавок ко всему, в него встроен чертовски хороший интерактивный отладчик.

4 голосов
/ 12 февраля 2009

Для использования в командной строке попробуйте cscope ; он должен быть в состоянии ответить на этот и другие вопросы:

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

он не написан для C ++, но может быть в состоянии обработать поиск в кодовой базе C ++ (с некоторыми предостережениями ).

Если вы ищете веб-интерфейс, рассмотрите OpenGrok , который работает на сервере и индексирует вашу систему контроля версий. У него нет поиска, который вы ищете, в частности, но он может быть аппроксимирован поиском символов.

2 голосов
/ 12 февраля 2009

SlickEdit может пометить каждый символ в вашем проекте, включая библиотеки, для отображения в «Показать ссылки». Это будет who.calls плюс один, где плюс один - это определение. Это основано на источнике.

1 голос
/ 12 февраля 2009

GNU Global выполняет работу за меня в системах на основе Unix.

0 голосов
/ 23 августа 2009

Можно найти поисковую систему с исходным кодом, чувствительную к языку. в Исходный код SD Поисковая система . Он может обрабатывать много языков одновременно. Поиск может быть выполнен для шаблонов в определенном языке, или шаблоны для разных языков (например, «найти идентификаторы с учетом TAX»). Благодаря чувствительности к токенам языка количество ложных срабатываний уменьшается, экономия времени для пользователя. Он понимает C, C ++, C #, COBOL, Java, ECMAScript, Java, XML, Verilog, VHDL и ряд других языков, в том числе FORTRAN.

С помощью этого инструмента легко определить, кто звонит в X на Фортране; просто искать все идентификаторы «X». Фактический тип запроса: I = X («любой идентификатор с именем X»). Это находит все ссылки по всей базе кода souce.

...