Найти объявление и определение функции, используя bash - PullRequest
14 голосов
/ 13 марта 2010

Я смотрю на большой проект C ++ с более чем 100 файлами. Учитывая определенное имя функции, как можно найти, просто используя инструменты bash, такие как find или grep, объявление и определение функции?

Спасибо

Ответы [ 5 ]

13 голосов
/ 13 марта 2010

Попробуйте ack , что намного лучше, чем grep. Цветная подсветка, работы ...

$ ack funcion_name

Распечатывает все случаи использования функции имя-функции рекурсивным поиском по исходным файлам, а также достаточно умен, чтобы игнорировать .svn и другие метаданные

4 голосов
/ 11 марта 2019

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

int f(int a) { return 2; }
int g(a,b,c,d) int a,b,c,d; { return 2; }

но они не смогут дать полное значение, когда ваш источник немного более запутанный:

int f ( // declares a function
        // this function is going to be awesome      
        int a  // first variable
      ) { return 2; }

Вы, вероятно, должны использовать ctags.

3 голосов
/ 13 марта 2010

в самом простом случае,

grep -ER '^.*(.*);' file  #find declaration.

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

2 голосов
/ 27 марта 2017

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

Вдохновленный @ ghostdog74 Я думаю, что это может быть хорошим методом:

grep -Hnre '^.*fct_return.*fct_name.*(.*).*{

Он просто говорит: «захватите все от начала до тех пор, пока не найдете fct_return, затем что-нибудь, пока не найдете fct_name открывающую скобку» («затем что-нибудь, пока не найдете закрывающую скобку») «затем что-нибудь, пока не найдете» { "

2 голосов
/ 13 марта 2010

Если у вас есть соглашение, что определение функции начинается в начале строки, тогда вы можете использовать:

find . -exec egrep '^fn' '{}' ';' >/dev/null -print

если вы хотите ограничить заголовки, вы можете поставить -name * .h перед -exec

NB. Если вы хотите сделать это много, посмотрите на «теги» и друзья стреляют, обновляя индекс, который будет быстрее в будущем.

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