我想要做到这个:
extract_prototypes file1.c file2.cpp file3.c
我希望有一个脚本/程序可以打印给定C/C++文件中定义的所有函数原型的清单,它必须能够很好地处理多行声明。
是否有可以完成此工作的程序? 越简单越好。
编辑:尝试编译两个C程序后,最好使用{perl、python、ruby}之一的东西来实现。
我想要做到这个:
extract_prototypes file1.c file2.cpp file3.c
我希望有一个脚本/程序可以打印给定C/C++文件中定义的所有函数原型的清单,它必须能够很好地处理多行声明。
是否有可以完成此工作的程序? 越简单越好。
编辑:尝试编译两个C程序后,最好使用{perl、python、ruby}之一的东西来实现。
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
来完成此操作。工具cproto可以满足您的需求,并且允许调整输出以适应您的要求。
注意:此工具仅适用于C文件。
我使用ctags
和jq
ctags --output-format=json --totals=no --extras=-F --fields=nP file1.c |
jq -sr 'sort_by(.line) | .[].pattern | ltrimstr("/^") | rtrimstr("$/") | . + ";"'
$ cat input.c
struct object *new_object (struct
/* COMMENT */
param
/* IGNORE ME */
*p)
{
return NULL;
}
int main (void)
{
return 0;
}
$ ./ctags -o - --kinds-C=f --kinds-C++=f -x --_xformat='%{typeref} %{name} %{signature};' input.c | tr ':' ' ' | sed -e 's/^typename //'
struct object * new_object (struct param * p);
int main (void);
$
http://cfunctions.sourceforge.net
这个网站只支持C语言和C++的有限子集。免责声明:这是我的程序。
-aux-info
来获取此信息。请参见这里。/* src/main.c:30:NC */ static void usage (const char *);
/* src/main.c:32:NF */ extern int main (int argc, char **argv); /* (argc, argv) int argc; char **argv; */
/* src/main.c:57:NF */ static void usage (const char *prog_name); /* (prog_name) const char *prog_name; */
我曾经使用doxygen为我的C++代码生成文档。虽然我不是专家,但我认为你可以使用doxygen生成一些函数原型的索引文件。
这里有一个thread,有人问了类似的问题。
gccxml
很有趣,但它只打印一个 XML 树。你需要提取关于类、函数、类型甚至是类和函数的专业模板的信息。gccxml
使用 GCC 的解析器,因此你不需要做最糟糕的工作,即解析 C++ 文件,并且你可以100%确定这是最好的编译器所理解的。
你可以通过这个程序运行源文件:
/* 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