Pregunta

    

Esta pregunta ya tiene una respuesta aquí:

         

Tengo un archivo fuente de C ++ y un archivo fuente de Python. Me gustaría que el archivo fuente C ++ para poder utilizar el contenido del archivo fuente de Python como una gran cadena literal. Yo podría hacer algo como esto:

char* python_code = "
#include "script.py"
"

Pero eso no va a trabajar porque no tiene por qué ser \ 's al final de cada línea. Podría copiar y pegar manualmente en el contenido del código de Python y rodear cada línea con cotizaciones y un terminador \ n, pero eso es feo. A pesar de que la fuente de Python va a ser compilado efectivamente en mi aplicación C ++, me gustaría guardarlo en un archivo separado porque es más organizado y funciona mejor con los editores (Emacs no es lo suficientemente inteligente como para reconocer que a C cadena literal es el código python y cambie al modo de pitón mientras estás dentro de él).

Por favor, no sugieren que utilizo PyRun_File, eso es lo que estoy tratando de evitar en primer lugar;)

¿Fue útil?

Solución

El C / C ++ actos del preprocesador en unidades de fichas, y una cadena literal es un solo token. Como tal, no se puede intervenir en el medio de una cadena literal de esa manera.

Se puede preprocesar script.py en algo como:

"some code\n"
"some more code that will be appended\n"

y #include que, sin embargo. O puede utilizar xxd ​ -i para generar una matriz estática C listo para su inclusión.

Otros consejos

Esto no obtendrá todo el camino, pero le conseguirá muy muy cerca.

Suponiendo script.py contiene lo siguiente:

print "The current CPU time in seconds is: ", time.clock()

En primer lugar, envolverlo como esto:

STRINGIFY(print "The current CPU time in seconds is: ", time.clock())

A continuación, justo antes de que lo incluya, hacer esto:

#define STRINGIFY(x) #x

const char * script_py =
#include "script.py"
;

Hay probablemente una respuesta aún más fuerte que eso, pero todavía estoy buscando.

La mejor manera de hacer algo como esto es incluir el archivo como un recurso si su entorno / conjunto de herramientas tiene esa capacidad.

Si no es así (como los sistemas integrados, etc.), se puede utilizar una utilidad bin2c (algo así como http://stud3.tuwien.ac.at/~e0025274/bin2c/bin2c.c ). Que va a tomar la representación binaria de un archivo y escupir un archivo fuente de C que incluye una matriz de bytes inicializados a esos datos. Es posible que tenga que hacer algunos ajustes de la herramienta o el archivo de salida si desea que la matriz sea '\ 0' terminado.

Incorporar ejecutar la utilidad bin2c en su makefile (o como una etapa de pre-construcción de lo que usted está utilizando para conducir su construye). A continuación, sólo tiene el archivo compilar y enlazar con su solicitud y usted tiene su cadena (o cualquier otra imagen del archivo) que se sienta en un trozo de memoria representada por la matriz.

Si está incluido un archivo de texto como una cadena, una cosa que debe tener en cuenta es que los finales de línea podrían no coincidir con lo que esperan funciones - esto podría ser otra cosa que te gustaría añadir a la utilidad o bin2c querrá asegurarse de que su código controla cualquier línea terminaciones están en el archivo correctamente. Tal vez modificar la utilidad bin2c tener un interruptor '-s' que indica que desea un archivo de texto incorportated como una cadena para finales de línea se normalizará y un byte cero estarán en la final de la matriz.

Vas a tener que hacer un poco de su propio procesamiento en el código Python, para hacer frente a cualquier comillas dobles, barras invertidas, trigrafos, y posiblemente otras cosas, que aparecen en ella. Puede que al mismo tiempo convertir los saltos de línea en \ n (o barra invertida-escapar de ellos) y añadir las comillas dobles en los extremos. El resultado será un archivo de cabecera generado a partir del archivo fuente de Python, que luego se puede # include. Utilice el proceso de construcción de automatizar este, por lo que todavía se puede editar el código fuente Python como Python.

Se puede usar Cog como parte de su proceso de construcción (para hacer el pre-procesamiento y para incrustar el código). Tengo que reconocer que el resultado de esto probablemente no es ideal, ya continuación, se termina de ver el código en ambos lugares. Pero cada vez que veo el "Python", "C ++", y "preprocesador" en la proximidad Closs, siento que merece una mención.

Aquí es cómo automatizar la conversión con cmd.exe

------ ------ html2h.bat

@echo off
echo const char * html_page = "\
sed "/.*/ s/$/ \\n\\/" ../src/page.html | sed s/\"/\\\x22/g 
echo.
echo ";

Se le llamó como

cmd /c "..\Debug\html2h.bat" > "..\debug\src\html.h"

y unido al código por

#include "../Debug/src/html.h"
printf("%s\n", html_page);

Esto es muy dependiente del sistema enfoque, pero, como la mayoría de la gente, no me gustaba el volcado hexadecimal.

Uso fopen, getline y fclose.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top