Список функций C/C++ (Анализ кода в Unix)

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

Вот типичный пример того, как он может помочь. Для нахождения определения PHP функционируют, я интересуюсь, я могу ввести это в командной строке:

grep -r "function myfunc" .

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

grep "function " ./src/mine.class.php

С тех пор нет никакого единственного ключевого слова, которое обозначает функцию или метод в C++ и потому что это - обычно более сложный синтаксис, я думаю, что мне были бы нужны некоторый статический инструмент анализа кода, умное использование Препроцессора C или слепой веры, кодер следовал строгим инструкциям по коду (# пробела, положения кюри и т.д.) для получения этих видов результатов.

Что Вы порекомендуете?

12
задан ROMANIA_engineer 1 December 2017 в 21:32
поделиться

5 ответов

Запустите его через doxygen. Он будет жаловаться на отсутствие комментирования, но все равно создаст диаграммы вызовов и перечислит все функции. Представлено в HTML со ссылками для перехода по путям кода.

doxygen

16
ответ дан 2 December 2019 в 03:53
поделиться

Doxygen может генерировать разумную html-документацию и анализировать Комментарии. Это не идеально, но может помочь. Вы можете включить Ctags в свой редактор, чтобы перейти к нужным функциям.

Лично я использую grep;)

5
ответ дан 2 December 2019 в 03:53
поделиться

Exuberant Ctags http://ctags.sourceforge.net/

Некоторое время назад я использовал его только время от времени и из текстового редактора, но посмотрите список утилит / инструменты, которые могут его использовать:

http://ctags.sourceforge.net/tools.html

10
ответ дан 2 December 2019 в 03:53
поделиться

grep '^[a-zA-Z0-9][ *]+ {[a-zA-Z0-9_]+}\([a-zA-Z0-9\,\.\-\>]\*\)$'

Это примерно то, что вы хотите. Это может потребовать некоторой игры, но сопоставить допустимый тип возврата C++, дать возможность быть указателем, затем имя функции (которое будет \1), открытые круглые скобки, параметры, закрытие.

Эта общая форма (return, name, (param)) должна работать, если только у вас нет переносов строк внутри объявления функции.

Я бы использовал Doxygen или другой инструмент для анализа, но если вам нужно сделать это быстро и один раз, regex может быть проще (а может и нет, с regex никогда не знаешь).

2
ответ дан 2 December 2019 в 03:53
поделиться

cscope очень хорош для таких вещей. В отличие от ctags, cscope предоставляет интерфейс, пригодный для поиска (ctags требует редактора).

Просто запустите cscope в корневом каталоге кода, который вы хотите проверить. Он создаст базу данных, если ее нет, обновит базу данных, если она есть, и откроет curses gui, где вы сможете запросить все виды полезной информации

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

ctags делает только первое, "все ссылки на символ".

5
ответ дан 2 December 2019 в 03:53
поделиться