Ответ 1
Инструмент cproto делает то, что вы хотите, и позволяет настраивать вывод в соответствии с вашими требованиями.
Примечание. Этот инструмент также работает только для файлов C.
Я хочу сделать это:
extract_prototypes file1.c file2.cpp file3.c
и иметь любую script/программу, распечатать хороший список прототипов функций для всех функций, определенных в данных файлах C/С++. Он должен обрабатывать многострочные объявления.
Есть ли программа, которая может выполнять эту работу? Чем проще, тем лучше.
EDIT: после попытки скомпилировать две программы C, бонусные очки за что-то, что использует {perl, python, ruby}.
Инструмент cproto делает то, что вы хотите, и позволяет настраивать вывод в соответствии с вашими требованиями.
Примечание. Этот инструмент также работает только для файлов C.
Я использую ctags
# p = function declaration, f = function definition
ctags -x --c-kinds=fp /usr/include/hal/libhal.h
Также работает с С++
ctags -x --c++-kinds=pf --language-force=c++ /usr/include/c++/4.4.1/bits/deque.tcc
Обратите внимание: вам может понадобиться добавить include paths, сделайте это, используя -I /path/to/includes
.
http://cfunctions.sourceforge.net
(Это только C и ограниченное подмножество С++. Отказ от ответственности: это моя программа.)
Я использовал doxygen для создания документации для моего кода на С++. Я не эксперт, но я думаю, что вы можете использовать doxygen для создания своего рода индексного файла прототипов функций.
Вот thread того, кто задает аналогичный вопрос
Если вы отформатируете свои комментарии соответствующим образом, вы можете попробовать DOxygen. На самом деле, если вы еще не пробовали это, прежде чем я порекомендую его в любом случае - он будет создавать графики наследования, а также полные списки функций и описания функций (из ваших комментариев).
gccxml
интересен, но он печатает дерево xml. Вам нужно извлечь информацию о классе, функциях, типах и даже специализированных шаблонах класса и функций. gccxml
использовать синтаксический анализатор GCC, поэтому вам не нужно выполнять худшую работу, которая обрабатывает файл С++, и вы на 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, вы должны установить определения, включите файлы, чтобы сделать это не так.
например, cc cproto_parser.c -o cproto_parser; cc -E your_source_file.c|./cproto_parser