2010-06-17 9 views
5

Lo ideal sería poder agregar código C/C++ (muy repetitivo) a mi código actual, pero en tiempo de compilación, código que vendría de decir, el stdout de un pitón secuencia de comandos, de la misma manera que uno hace con macros.Generando código en tiempo de compilación utilizando scripts

Por ejemplo, digamos que yo quiero tener funciones que dependen de los atributos comunes de una clase dada, pudiendo acaba de escribir lo siguiente en mi código C++ sería una bendición:

generate_boring_functions(FooBarClass,"FooBarClass.cpp") 

es eso factible usando medios convencionales? ¿O debo hackear con Makefiles y archivos fuente temporales?

Gracias.

+0

Pensé que los Makefiles eran medios convencionales. ¿Qué tenías en mente? –

+1

¿Cuáles son las funciones aburridas? ¿Son algo que podría resolverse con una solución basada en plantillas? –

+0

No, no es una plantilla solucionable, y sé que los Makefiles son medios convencionales, pero solo quise decir algo que funcionaría simplemente haciendo el estúpido simple "g ++ foo.cpp -o foo", supongo que eso es demasiado pedir;) – Manux

Respuesta

3

Lo más probable es que necesite modificar un poco el Makefile. Sería fácil escribir una secuencia de comandos (Python) que lea cada uno de sus archivos fuente como un paso de preprocesamiento adicional, reemplazando instancias de generate_boring_functions (o cualquier otra secuencia de comandos) con el código correcto, posiblemente solo invocando generate_boring_functions.py con los argumentos correctos y evitando la necesidad de archivos temporales enviando la fuente al compilador por sobre la entrada estándar.

Maldita sea, ahora quiero hacer algo como esto.

Editar: Una regla como esta, atascada en un archivo MAKE, podría usarse para manejar el paso de compilación adicional. Esto no se ha probado y se ha agregado solo para una toma en la integridad.

%.o : %.cpp 
    python macros.py $< | g++ -x cpp -c - -o [email protected] 
+0

¿Cómo enviaría la fuente al compilador a través de stdin (sin usar archivos temporales)? – Manux

+0

Oy, http://stackoverflow.com/questions/2083874/compile-string-of-c-code – Manux

+0

@Manux: este enfoque solo funcionaría con un archivo fuente a la vez ... –

2

¡Un archivo MAKE (o equivalente) es un medio "convencional"!

0

Puede probar la Biblioteca de preprocesador de Boost. Es solo una extensión del preprocesador regular, pero si eres creativo, puedes lograr casi cualquier cosa en él.

3

Si un archivo MAKE no es lo suficientemente convencional para usted, podría hacerlo con macros ingeniosamente escritas.

class FooBarClass 
{ 
    DEFINE_BORING_METHODS(FooBarClass) 

    /* interesting functions begin here */ 
} 

Veo esto muy a menudo para implementar las partes repetidas de las clases COM.

Pero si quieres algo que no sea make ni macro, entonces no sé lo que podrías decir.

+0

+1 macros para simplificar el código repetitivo. –

0

¿Echaste un vistazo a PythoidC? Se puede usar para generar código C.

2

Nunca he usado esta tecnología en particular, pero parece que estás buscando algo como la herramienta Ned Batchelder's Cog.

Las secuencias de comandos de Python se incrustan en un archivo fuente de C++ de modo que cuando se ejecuta a través de la herramienta de engranaje, se genera código C++ adicional para el compilador de C++. Por lo tanto, su proceso de compilación consistiría en un paso adicional para que Cog cree el archivo fuente real de C++ antes de invocar el compilador C++.

Cuestiones relacionadas