2009-09-10 27 views
25

Tengo un montón de archivos de cabecera C++ con varias declaraciones de clases y funciones. Hasta ahora, cuando he estado escribiendo las implementaciones de C++ archivo de origen de las clases y funciones declaradas, he estado manualmente:¿Generar automáticamente un archivo C++ desde el encabezado?

  1. Copia de las declaraciones del fichero de cabecera al archivo de origen correspondiente.
  2. Eliminando "class classname {" y la coincidencia "};"
  3. Añadiendo "classname ::" a los nombres de todas las funciones de clase.
  4. Reemplazando los puntos y comas después de las declaraciones de funciones con "{}".
  5. Eliminando las palabras clave "virtual" y "estático".

Solo después de todo ese trabajo, que realmente no hace nada, ¿puedo realmente implementar las funciones? Me pregunto si existe alguna herramienta en alguna parte que pueda generar automáticamente un archivo ".cpp" a partir de un archivo ".h", donde el ".cpp" resultante contenga stubs vacíos para las funciones declaradas en el archivo ".h" (y para el cual no se ha proporcionado una definición en línea). Se preferiría una herramienta de línea de comandos amigable con UNIX. Gracias.

ACTUALIZACIÓN: Una herramienta multiplataforma sería ideal. Si no, estoy trabajando en Mac OS X 10.6.

Respuesta

21

Lazy C++ parece estar diseñado para abordar precisamente ese problema.

+0

Lazy C++ no parece ser instalable en Mac OS X ... que es lo que estoy usando. ¿Hay generadores multiplataforma que sepa que se pueden construir fácilmente desde la fuente? –

+1

+1 recurso muy interesante. –

+1

@Michael: puede obtener la fuente y la compilación cruzada para OSX, consulte p. Ej. respuesta a http: // stackoverflow.com/questions/1375201/lazy-c-chicken-and-egg-problem – moonshadow

3

La eclipse CDT tiene una función "Implementar método" que hace exactamente eso (un método a la vez). También hay una función "Generar captadores y setters" que también genera el código apropiado en los cuerpos de función.

+0

Gracias. Estoy buscando una invocación de línea de comandos, sin embargo ... algo que puedo usar en un comando "buscar" para generar recursivamente archivos ".cpp" para todos los archivos de encabezado en mi proyecto. –

5

Me encontré en su situación últimamente y tripulado para escribir mi propia herramienta - impl_me. Es un pequeño script de Ruby que usa SWIG como un backend de analizador. Escribe en stdout para que pueda combinar con su juego de herramientas favorito de nix find/grep/sed/awk para modificar sus preferencias.

Como está escrito en Ruby, debe ser multiplataforma. SWIG también es multiplataforma, por lo que todo debería estar bien.

Es bastante primitivo en esta etapa y no es tan robusto como Lazy C++ en términos de análisis de plantillas y objetos extraños. Las contribuciones son bienvenidas :)

0

Intenté Lazy C++ pero parece estar desactualizado y ya no se mantiene. Tampoco es compatible con el último estándar C++ 14.

Es por eso que decidí escribir mi propia herramienta en Java usando ANTLR4. Se llama Score y puedes encontrarlo aquí: https://github.com/underrated/Score

Por el momento está en su infancia y podría estar lleno de errores, pero tengo la intención de mejorarlo. Así que pruébalo si quieres e informa cualquier error en la página github del proyecto. Trataré de arreglarlos lo más rápido posible.

+0

No espero que maneje los condicionales del preprocesador en este momento pero planeo agregar soporte para eso. Aparte de eso, la herramienta no tiene la intención de hacer verificaciones semánticas en el código. Simplemente identifica las implementaciones del método y luego coloca los prototipos del método en el encabezado y la implementación del método en el archivo fuente (más algunas "separaciones" más). Depende del desarrollador asegurar la corrección del código (por ejemplo, mediante el uso de un IDE). Si el código original tiene errores sintácticos/semánticos, también lo hará el generado. Pero pueden ser encontrados, ya sea por el IDE o por el compilador. –

+0

@IraBaxter ¿Por qué necesitarías un manejo tan complejo de las cosas en el contexto del problema de Michael? Todo lo que necesita es automatizar la copia/pegado/modificación de algún código. El tratamiento especial para #ifdefs es realmente necesario. Las plantillas no necesitan ser tocadas, pueden permanecer en el encabezado. Las llamadas macro se verán como simples identificadores o llamadas de función por el analizador y tampoco necesitan ser tocadas. En cuanto a los espacios de nombres, todas las declaraciones "using ..." pueden permanecer en el encabezado. Y el "espacio de nombres ... {...}" se puede copiar tanto en el encabezado como en el archivo de origen. ¿Me estoy perdiendo de algo? –

Cuestiones relacionadas