2009-10-15 13 views
19

que desee hacer esto:Extracción de C/C++ prototipos de funciones

extract_prototypes file1.c file2.cpp file3.c 

y tener lo script/programa imprime una buena lista de prototipos de funciones para todas las funciones definidas en los ficheros dados C/C++. Debe manejar bien las declaraciones de varias líneas.

¿Hay algún programa que pueda hacer este trabajo? Cuanto más simple, mejor.

EDITAR: después de intentar compilar dos programas C, puntos de bonificación por algo que usa {perl, python, ruby}.

Respuesta

14

La herramienta cproto hace lo que quiere y permite ajustar la salida a sus requisitos.

Nota: Esta herramienta solo funciona para archivos C.

+0

argh, teniendo problemas para compilar cosas esta noche parece (en mac). se ve bien sin embargo ... – Peter

+1

No es una herramienta independiente. Necesita instalar gcc (probado en Windows). – rxantos

+0

Tenga en cuenta que cproto ya no funciona correctamente en gcc 4.5 o posterior, debido a un cambio en la forma en que gcc maneja los archivos de encabezado faltantes. (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=55115) –

3

http://cfunctions.sourceforge.net

(Esto sólo lo hace C y un subconjunto limitado de C++ de responsabilidad:.. Este es mi programa)

+1

hmm, no se compila. – Peter

+0

Gracias por informarme. –

+0

aquí hay una información un poco más útil, en caso de que ayude ... http://pastie.org/655762 – Peter

1

Solía ​​usar Doxygen para generar la documentación para mi código C++. No soy un experto, pero creo que puedes usar doxygen para generar algún tipo de archivo de índice de los prototipos de función.

Aquí es una thread de alguien pidiendo una pregunta similar

+0

Gah, golpeado. Aunque estoy de acuerdo :-) –

1

Si formatea sus comentarios adecuadamente, podría intentar DOxygen. De hecho, si no lo ha probado antes, le recomendaría darle una oportunidad de todos modos: generará gráficos de herencia, así como listas y descripciones de funciones de miembros completos (de sus comentarios).

+0

Sí, he estado en el camino de Doxygen y estoy buscando algo mucho más simple para esta única tarea. (Dejaré la discusión sobre los méritos de doxygen en otro hilo.) – Peter

+0

En realidad, no tiene que comentar nada. Solo asegúrese de que su archivo Doxy tenga la opción de generar documentación para todos los miembros activados. Pero estuvo de acuerdo, este es un trabajo bastante complicado, aunque IIRC hay una opción de salida XML que puede intentar analizar. – blwy10

0

gcc-xml puede ayudar, aunque tal como está, solo hace la mitad del trabajo que desea. Necesitará algún procesamiento de la salida XML

+0

[rbgccxml] (https://github.com/jasonroelofs/rbgccxml) parece hacer el resto. Utiliza otra gema de rubí llamada nokogiri para analizar el XML. – Sundar

1

gccxml es interesante, pero imprime un árbol xml. Necesita extraer información sobre clase, funciones, tipos e incluso las plantillas especializadas de clase y funciones. gccxml usa el analizador sintáctico de GCC, por lo que no necesitas hacer el peor trabajo que es analizar el archivo C++, y estás 100% seguro de que es lo que probablemente el mejor compilador entienda.

33

utilizo ctags

# p = function declaration, f = function definition 
ctags -x --c-kinds=fp /usr/include/hal/libhal.h 

también trabaja con C++

ctags -x --c++-kinds=pf --language-force=c++ /usr/include/c++/4.4.1/bits/deque.tcc 

Nota, es posible que tenga que añadir incluyen caminos, hacer esto utilizando la -I /path/to/includes.

+0

Una pena que tendrá que filtrar el resultado. De lo contrario, habría sido perfecto. El resultado es en forma de – rxantos

+0

Cuando uso, intento obtener el error "ctags: opción no reconocida" --c-types = fp '. Estoy usando ctags.exe en Windows. ¿Alguna idea sobre por qué obtengo este error? – mashrur

+0

Esto solo funciona si las declaraciones no están divididas en muchas líneas, al menos con Exuberant Ctags 5.8. – mondaugen

0

Puede ejecutar el archivo de origen a través de este programa:

/* 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;         
}      

Ejecutar a través del preprocesador para deshacerse de los comentarios. Si tiene llaves inigualables debido a #ifdefs, debe establecer las definiciones, incluya archivos para que no sea así.

p. Ej., cc cproto_parser.c -o cproto_parser; cc -E your_source_file.c|./cproto_parser

+0

Siéntase libre de portar esto a un lenguaje más adecuado. – mondaugen