2011-12-22 6 views
5

Me preguntaba si había una herramienta (tal vez el compilador GNU C++) para obtener de un archivo .cpp lleno de funciones un archivo .hpp con las declaraciones de funciones mencionadas.Cómo extraer declaraciones (un archivo .hpp) de la implementación (un archivo .cpp)?

Ejemplo:

tengo:
magic.cpp

int foo() { return 42; } 
char bar() { return 'z'; } 

Y me gustaría obtener esto después de la aplicación de la herramienta maravillosa:
magic.hpp

int foo(); 
char bar(); 
+0

posible duplicado de [Buscando generador de código auxiliar (de los archivos de cabecera)] (http: // stackoverflow .com/questions/2020568/seek-code-stub-generator-from-header-files) –

+0

Buscar y reemplazar '{' con ';/*' y '}' con '* /' lo hará, aunque no buena solución. – Pubby

+0

@Tim: Eso es al revés, ¿no? – Xeo

Respuesta

3

Consulte Dehydra or Treehydra. Una de estas dos herramientas debería permitirle realizar esto a través de GCC.

Dehydra es una herramienta de análisis estático ligero, programable y de propósito general herramienta capaz de análisis específicos de la aplicación del código C++.

2

Para hacer esto con precisión, necesita un analizador de C++ completo y un sistema de resolución de nombres porque necesita no solo las declaraciones de funciones sino también el contexto que las define. Por ejemplo, si usted tiene una declaración

void foo<T>(...){ ... } 

en el archivo, y hay un tipo T en el archivo, retener mejor la declaración de T, y todo lo que las declaraciones se utilizan para definir T, etc. Por lo que tiene Mantenga la web de definiciones compatibles con foo ... y debe decidir si desea mantener las que provienen de incluir archivos o no.

Nuestra DMS Software Reengineering Toolkit es un programa personalizable de análisis general de programas y maquinaria de transformación. Con su C++ Front End, se puede analizar el código de C++ (incluidos #includes), crear árboles de sintaxis abstracta (AST), resolver nombres y tipos de la caja. El código de personalización determinaría entonces la red de referencias necesaria, y para cada referencia, conviértala en una firma (en lugar de una implementación) si es necesario, aplicando source-to-source program transformations a los AST. La impresora bonita de DMS podría luego producir el texto de salida final.

DMS se ha utilizado para la ingeniería de C++ (re) a gran escala en otros grandes proyectos.

Por supuesto, siempre puedes escribir algún truco malo para simular esto, si no te importa una respuesta es probable que tengas que parchar a mano.

+0

¡Gran respuesta! Me estaba preguntando que no fue fácil. Pero nunca pensé que no se hubiera resuelto en el mundo del código abierto. En este momento, lo que estoy escribiendo es un código para un proyecto de curso para mi universidad, por lo que lo que me ofrecen está fuera de rango. Sin embargo, parece ser la herramienta adecuada. Esperaré por una solución más amigable para el público en general, pero si eso nunca sucede, creo que esta es la mejor solución disponible. – msemelman

4

En las distribuciones basadas en Debian:

apt-get install cproto 

Entonces cproto magic.cpp da el siguiente resultado:

/* magic.cpp */ 
int foo(void); 
char bar(void); 
+0

¡Waw! ¡gran respuesta! – msemelman

+0

Oh no, solo funciona para C (plano C). Estaba buscando una herramienta C++. ¡Gracias de cualquier manera! – msemelman

+0

Disculpa por eso, entonces no estaba al tanto. –

Cuestiones relacionadas