Question

    

Cette question a déjà une réponse ici:

         

J'ai un fichier source C ++ et un fichier source Python. Je voudrais que le fichier source C de pouvoir utiliser le contenu du fichier source Python comme une grande chaîne littérale. Je pouvais faire quelque chose comme ceci:

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

Mais cela ne fonctionne pas parce qu'il ya besoin d'être \ 's à la fin de chaque ligne. Je pourrais copier et coller manuellement dans le contenu du code Python et entourent chaque ligne avec des guillemets et une terminaison \ n, mais c'est laid. Même si la source python va être compilé dans mon application C ++ efficace, je voudrais le garder dans un fichier séparé, car il est plus organisé et fonctionne mieux avec les éditeurs (emacs est pas assez intelligent pour reconnaître que C chaîne de caractères est le code python et passer en mode python pendant que vous êtes à l'intérieur).

S'il vous plaît ne suggère pas que j'utilise PyRun_File, c'est ce que je suis en train d'éviter en premier lieu;)

Était-ce utile?

La solution

Le C / C ++ agit par le préprocesseur en unités de jetons, et une chaîne de caractères est une à jeton. En tant que tel, vous ne pouvez pas intervenir au milieu d'une chaîne littérale comme ça.

Vous pouvez prétraiter script.py dans quelque chose comme:

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

et #include que, cependant. Ou vous pouvez utiliser xxd ​ -i pour générer un tableau statique C prêt à être inclus.

Autres conseils

Cela ne vous donnera pas tout le chemin là-bas, mais il vous fera sacrément proche.

En supposant script.py contient ceci:

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

Tout d'abord, l'envelopper comme ceci:

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

Alors, juste avant l'inclure, faites ceci:

#define STRINGIFY(x) #x

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

Il y a probablement une réponse encore plus serré que cela, mais je suis toujours à la recherche.

La meilleure façon de faire quelque chose comme ceci est d'inclure le fichier en tant que ressource si votre environnement / jeu d'outils a cette capacité.

Dans le cas contraire (comme les systèmes embarqués, etc.), vous pouvez utiliser un utilitaire bin2c (quelque chose comme http://stud3.tuwien.ac.at/~e0025274/bin2c/bin2c.c ). Il va prendre la représentation binaire et recracher un fichier source C d'un fichier qui comprend un tableau d'octets initialisés à ces données. Vous pourriez avoir besoin de faire quelques ajustements de l'outil ou le fichier de sortie si vous voulez que le tableau à « \ 0 » a pris fin.

Incorporer l'exécution de l'utilitaire bin2c dans votre makefile (ou une étape de pré-construction de tout ce que vous utilisez pour conduire votre construit). Ensuite, il suffit que le fichier compilé et lié à votre demande et vous avez votre chaîne (ou tout autre image du fichier) assis dans une partie de la mémoire représentée par le tableau.

Si vous incluez un fichier texte sous forme de chaîne, une chose que vous devez savoir est que les fins de ligne pourraient ne pas correspondre à ce que les fonctions attendent - cela pourrait être une autre chose que vous voudriez ajouter à l'utilitaire bin2c ou vous « ll voulez vous assurer que votre code gère tout les fins de ligne sont dans le fichier correctement. Peut-être modifier l'utilitaire bin2c d'avoir un commutateur « -s » que vous voulez indique un fichier texte Incorportated comme une chaîne si les fins de ligne seront normalisées et un octet nul sera à la fin du tableau.

Vous allez devoir faire un peu de votre propre traitement sur le code Python, pour faire face à des guillemets doubles, les antislashs, trigraphes, et peut-être d'autres choses, qui apparaissent en elle. Vous pouvez en même temps tourner dans les nouvelles lignes \ n (ou les anti-slash échapper) et ajouter les guillemets à chaque extrémité. Le résultat sera un fichier d'en-tête généré à partir du fichier source Python, que vous pouvez ensuite #include. Utilisez votre processus de construction pour automatiser cela, de sorte que vous pouvez toujours modifier la source de Python Python.

Vous pouvez utiliser Cog dans le cadre de votre processus de construction (pour faire le pré-traitement et à intégrer le code). Je reconnais que le résultat de ceci est sans doute pas idéal, car vous finissez par voir le code dans les deux endroits. Mais chaque fois que je vois le « Python », « C ++ » et « préprocesseur » à proximité Closs, je pense qu'il mérite une mention.

Voici comment automatiser la conversion avec cmd.exe

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

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

Il a été appelé comme

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

et fixé à l'aide du code par

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

Ceci est tout à fait l'approche dépendante du système mais, comme la plupart des gens, je n'aimais pas la décharge hexagonale.

Utilisez fopen, getline et fclose.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top