Извлечение прототипов функций C / C ++
-
21-09-2019 - |
Вопрос
Я хочу сделать это:
extract_prototypes file1.c file2.cpp file3.c
и пусть любой скрипт / программа распечатает хороший список прототипов функций для всех функций, определенных в данных файлах C / C ++.Он должен хорошо обрабатывать многострочные объявления.
Существует ли программа, которая может выполнить эту работу? Чем проще, тем лучше.
Редактировать:после попытки скомпилировать две программы на C, бонусные баллы за то, что использует {perl, python, ruby}.
Решение
Инструмент спрото делает то, что вы хотите, и позволяет настроить вывод в соответствии с вашими требованиями.
Примечание: Этот инструмент также работает только для файлов C.
Другие советы
Я использую ctags
# p = function declaration, f = function definition
ctags -x --c-kinds=fp /usr/include/hal/libhal.h
Также работает с C ++
ctags -x --c++-kinds=pf --language-force=c++ /usr/include/c++/4.4.1/bits/deque.tcc
Обратите внимание, что вам может потребоваться добавить включаемые пути, сделайте это с помощью -I /path/to/includes
.
http://cfunctions.sourceforge.net
(Это касается только C и ограниченного подмножества C ++.Отказ от ответственности:это моя программа.)
Раньше я использовал doxygen для создания документации для моего кода на C ++.Я не эксперт, но я думаю, что вы можете использовать doxygen для генерации своего рода индексного файла прототипов функций.
Вот такой Нитки о том, что кто-то задает подобный вопрос
gccxml
интересно, но он печатает xml-дерево.Вам необходимо извлечь информацию о классе, функциях, типах и даже специализированных шаблонах класса и функций. gccxml
используйте parser из GCC, поэтому вам не нужно выполнять худшую работу, которая заключается в разборе файла C ++, и вы на 100% уверены, что это то, что, вероятно, понимает лучший компилятор.
Если вы соответствующим образом отформатируете свои комментарии, вы могли бы попробовать Доксиген.На самом деле, если вы не пробовали это раньше, я бы все равно рекомендовал попробовать - это приведет к созданию графиков наследования, а также полных списков функций-членов и описаний (из ваших комментариев).
gcc-xml-файл может помочь, хотя как бы то ни было, это делает только половину той работы, которую вы хотите.Вам потребуется некоторая обработка выходных данных XML
Вы можете запустить исходный файл с помощью этой программы:
/* cproto_parser.c */
#include <stdio.h>
int main (void)
{
int c;
int infundef = 0;
int nb = 0,
np = 0;
while((c=getc(stdin))!=EOF){
if(c=='{'){
if((np==0)&&(nb==0)){infundef=1;}
nb++;
}
if (infundef==0) {putc(c,stdout);}
if(c=='}'){
if((np==0)&&(nb==1)){infundef=0;}
nb--;
}
if(c=='('){np++;}
if(c==')'){np--;}
}
return 0;
}
Запустите препроцессор, чтобы избавиться от комментариев.Если у вас есть несоответствующие фигурные скобки из-за #ifdefs, вы должны установить defines, включить файлы, чтобы сделать это не так.
например ,, cc cproto_parser.c -o cproto_parser; cc -E your_source_file.c|./cproto_parser