Domanda

    

Questa domanda ha già una risposta qui:

         

Ho un file C ++ di origine e un file sorgente Python. Mi piacerebbe C ++ file sorgente per essere in grado di utilizzare il contenuto del file sorgente Python come un grande stringa letterale. Avrei potuto fare qualcosa di simile:

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

Ma questo non funzionerà perché non hanno bisogno di essere \ s 'alla fine di ogni riga. Potrei copiare e incollare manualmente nei contenuti del codice Python e circondare ogni linea con le citazioni e una terminazione \ n, ma questo è brutto. Anche se il sorgente Python sta per essere efficace compilato in mio C ++ app, mi piacerebbe tenerlo in un file separato, perché è più organizzato e funziona meglio con i redattori (emacs non è abbastanza intelligente da riconoscere che un C stringa letterale è il codice python e passare alla modalità di pitone mentre si è al suo interno).

Si prega di non suggerire che uso PyRun_File, che è quello che sto cercando di evitare in primo luogo;)

È stato utile?

Soluzione

Il C / C ++ atti preprocessore in unità di gettoni e una stringa letterale è una solo token. In quanto tale, non è possibile intervenire nel bel mezzo di una stringa letterale del genere.

Si potrebbe preprocess script.py in qualcosa di simile:

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

e # include che, comunque. Oppure è possibile utilizzare xxd ​ -i per generare un array statico C pronto per l'inclusione.

Altri suggerimenti

Questo non ti porterà per tutto il tragitto, ma ti porterà dannatamente vicino.

Supponendo script.py contiene questo:

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

In primo luogo, avvolgetelo in questo modo:

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

Poi, poco prima di includerlo, fare questo:

#define STRINGIFY(x) #x

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

C'è probabilmente una risposta ancora più stretta di quello, ma io sto ancora cercando.

Il modo migliore per fare qualcosa di simile è quello di includere il file come una risorsa se l'ambiente / set di strumenti ha questa capacità.

In caso contrario (come i sistemi embedded, ecc), è possibile utilizzare un programma di utilità bin2c (qualcosa come http://stud3.tuwien.ac.at/~e0025274/bin2c/bin2c.c ). Ci vorrà rappresentazione binaria di un file e sputare fuori un file sorgente C che include un array di byte inizializzati a tali dati. Potrebbe essere necessario fare qualche ritocco dello strumento o il file di output se si desidera che la matrice di essere '\ 0' terminato.

Incorporare l'esecuzione dell'utilità bin2c nel makefile (o come una fase di pre-build di qualsiasi cosa tu stia usando per guidare la vostra build). Poi basta avere il file compilato e collegato con l'applicazione e si dispone la stringa (o qualunque altra immagine del file) seduto in un pezzo di memoria rappresentato dalla matrice.

Se stai tra cui un file di testo come stringa, una cosa che si dovrebbe essere consapevoli è che la fine riga potrebbero non corrispondere a ciò che si aspettano funzioni - questa potrebbe essere un'altra cosa che ci si vuole aggiungere al programma di utilità bin2c o 'll vogliono assicurarsi che il codice gestisce qualunque linea di terminazioni sono nel file in modo corretto. Forse modificare il programma di utilità bin2c di avere uno switch '-s' che indica che si desidera un file di testo incorportated come una stringa in modo terminazioni linea sarà normalizzata e un byte zero saranno alla fine della matrice.

Si sta andando ad avere per fare un po 'della propria elaborazione sul codice Python, per affrontare eventuali doppi apici, backslash, trigrammi, e possibilmente altre cose, che compaiono in esso. È possibile allo stesso tempo girare a capo in \ n (o backslash-fuga) e aggiungere le virgolette su entrambe le estremità. Il risultato sarà un file di intestazione generato dal file sorgente Python, che si può quindi #include. Usa il tuo processo di compilazione per automatizzare questo, in modo che si può ancora modificare il sorgente Python come Python.

Si potrebbe utilizzare Cog come parte del processo di generazione (per fare la pre-elaborazione e incorporare il codice). Ammetto che il risultato di questo probabilmente non è l'ideale, da allora si finisce per vedere il codice in entrambi i luoghi. Ma ogni volta che vedo il "Pitone", "C ++", e "preprocessore" in prossimità Closs, sento che merita una menzione.

Ecco come automatizzare la conversione con cmd.exe

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

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

E 'stato chiamato come

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

e attaccato al codice

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

Questo è abbastanza dipendente dal sistema approccio, ma, come la maggior parte delle persone, non mi piaceva il dump esadecimale.

Usa fopen, getline e fclose.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top