Frage

    

Diese Frage bereits eine Antwort hier:

         

Ich habe eine C ++ Quelldatei und eine Python-Quelldatei. Ich mag die C ++ Quelldatei wörtliche den Inhalt der Python-Quelldatei als eine große Zeichenfolge verwenden können. Ich könnte so etwas tun:

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

Aber das wird nicht funktionieren, weil es sein muß, \ 's am Ende jeder Zeile. Ich konnte manuell kopieren und in dem Inhalt des Python-Code einfügen und jede Zeile mit Anführungszeichen und einem Abschluss \ n, aber das ist hässlich. Auch wenn der Python-Source effektiv in meine C ++ app kompiliert wird sein, würde ich es in einer separaten Datei halten mag, weil es besser organisiert ist und funktioniert besser mit Editoren (Emacs sind nicht intelligent genug, dass ein erkennen C Stringliteral ist python-Code und wechseln Sie in python-Modus, während Sie im Inneren sind).

Bitte lassen nicht darauf schließen Ich benutze PyRun_File, das ist, was ich versuche in erster Linie zu vermeiden;)

War es hilfreich?

Lösung

Die C / C ++ Präprozessor wirkt in Einheiten von Token und ein Zeichenfolgenliteral ist ein Single Token. Als solche können Sie in der Mitte eines Stringliteral so nicht eingreifen.

Sie könnten Vorprozess script.py in so etwas wie:

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

und # include, dass jedoch. Oder Sie verwenden können, xxd ​ -i ein C statisches Array bereit für die Aufnahme zu erzeugen.

Andere Tipps

Dies wird nicht bekommen Sie den ganzen Weg dorthin, aber es wird verdammt nahe.

Unter der Annahme, script.py enthält diese:

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

Erstens, es einpacken wie folgt aus:

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

Dann, kurz bevor Sie es sind, dies zu tun:

#define STRINGIFY(x) #x

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

Es gibt wahrscheinlich eine noch engere Antwort als das, aber ich bin noch auf der Suche.

Der beste Weg, um so etwas zu tun ist, um die Datei als eine Ressource zu schließen, wenn Ihre Umgebung / Toolset diese Fähigkeit hat.

Wenn nicht (wie eingebettete Systeme, etc.), können Sie ein bin2c Dienstprogramm (so etwas wie verwenden http://stud3.tuwien.ac.at/~e0025274/bin2c/bin2c.c ). Es dauert eine binäre Repräsentation der Datei und spucken eine C Quelldatei aus, die ein Array von Bytes, auf die Daten initialisiert enthält. Möglicherweise müssen einige Optimierungen des Werkzeugs oder die Ausgabedatei tun, wenn Sie das Array wollen ‚\ 0‘ beendet sein.

Integrieren Sie die bin2c Dienstprogramm in Ihrem Make-Datei ausgeführt wird (oder als Pre-Build-Schritt, was auch immer Sie mit Ihrem fahren Builds). Dann haben Sie einfach die Datei kompiliert und verknüpft mit Ihrer Anwendung und Sie haben Ihre Zeichenfolge (oder was auch immer andere Bild der Datei) in einem Teil des Speichers durch die Anordnung dargestellt sitzen.

Wenn Sie eine Textdatei als String sind, einschließlich, eine Sache, die Sie beachten sollten, ist, dass die Zeilenenden entsprechen möglicherweise nicht, welche Funktionen erwarten - das eine andere Sache sein könnte Sie zum bin2c Dienstprogramm hinzufügen wollen würde oder Sie ‚ll will Ihr Code, um sicherzustellen, Griffe, was Zeilenende in der Datei sind richtig. Vielleicht machen Sie das bin2c Dienstprogramm ändern, um einen ‚es‘ Schalter haben, die Sie Datei als String incorportated wollen einen Text zeigt so Zeilenende normalisieren sein werden und ein Null-Byte am Ende des Arrays sein wird.

Sie gehen zu müssen, einige Ihrer eigenen Verarbeitung auf der Python-Code zu tun, mit irgendwelchen doppelten Anführungszeichen, Schrägstriche, trigraphs beschäftigen und möglicherweise andere Dinge, die in ihm erscheinen. Sie können zur gleichen Zeit drehen Zeilenumbrüche in \ n (oder umgekehrten Schrägstrich-entkommen sie) und die doppelten Anführungszeichen an jedem Ende hinzufügen. Das Ergebnis wird eine Header-Datei aus der Python-Quelldatei erzeugt werden, die Sie dann # include. Verwenden Sie Ihren Build-Prozess, dies zu automatisieren, so dass Sie immer noch die Python-Quelle als Python bearbeiten können.

könnten Sie Cog als Teil des Build-Prozesses (die Vorverarbeitung zu tun und einbetten der Code). Ich gebe zu, dass das Ergebnis ist dies wahrscheinlich nicht ideal, da dann am Ende Sie den Code in beiden Orten zu sehen. Aber jedes Mal, wenn ich den „Python“, siehe „C ++“ und „Preprocessor“ in closs Nähe, ich fühle es eine Erwähnung verdient.

Hier ist, wie die Konvertierung mit cmd.exe automatisiert

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

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

Es hieß wie

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

und auf den Code angebracht, indem

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

Das ist ganz systemabhängigen Ansatz aber, wie die meisten Menschen, ich den Hex-Dump nicht mochte.

Mit fopen, getline und fclose.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top